Інтерфейси об'єктів

Інтерфейси об'єктів дозволяють створювати код, який вказує, які методи має реалізувати клас, без необхідності визначати, як саме вони мають бути реалізовані. Інтерфейси поділяють простір імен із класами та трейтами, тому вони не можуть називатися однаково.

Інтерфейси оголошуються так само, як і звичайні класи, але з використанням ключового слова interface замість class. Тіла методів інтерфейсів мають бути порожніми.

Усі методи, визначені в інтерфейсах, мають бути загальнодоступними, що випливає із самої природи інтерфейсу.

На практиці інтерфейси використовуються у двох взаємодоповнюючих випадках:

  • Щоб дозволити розробникам створювати об'єкти різних класів, які можуть використовуватися взаємозамінно, оскільки вони реалізують той самий інтерфейс або інтерфейси. Типовий приклад – кілька служб доступу до бази даних, кілька платіжних шлюзів або різних стратегій кешування. Різні реалізації можуть бути замінені без будь-яких змін у коді, що їх використовує.
  • Щоб дозволити функції або методу приймати та оперувати параметром, який відповідає інтерфейсу, не переймаючись тим, що ще може робити об'єкт або як він реалізований. Ці інтерфейси часто називаютьIterable Cacheable Renderableі так далі, щоб описати їхню поведінку.

Інтерфейси можуть визначати магічні методи, Вимагаючи від реалізуючих класів реалізації цих методів.

Зауваження :

Хотя они поддерживаются, использованиеконструкторів в інтерфейсах не рекомендується. Це значно знижує гнучкість об'єкта, що реалізує інтерфейс. Крім того, до конструкторів не застосовуються правила успадкування, що може призвести до суперечливої ​​та несподіваної поведінки.

implements

Для реализации интерфейса используется операторimplements. Клас повинен реалізувати всі методи, описані в інтерфейсі, інакше буде фатальна помилка. За бажанням класи можуть реалізовувати більше одного інтерфейсу, розділяючи кожен інтерфейс комою.

Увага

Клас, що реалізує інтерфейс, може використовувати для своїх параметрів ім'я, відмінне від імені інтерфейсу. Однак, починаючи з PHP 8.0, у мові підтримуються іменовані аргументи, і код, що викликає, може покладатися на ім'я параметра в інтерфейсі. З цієї причини рекомендується, щоб розробники використовували ті ж імена параметрів, що і інтерфейс, що реалізується.

Зауваження :

Інтерфейси можуть бути успадковані один від одного, так само, як і класи, за допомогою оператора extends

Зауваження :

Клас, що реалізує інтерфейс, повинен оголосити всі методи в інтерфейсі з сумісною сигнатурою. Клас може реалізовувати кілька інтерфейсів, які оголошують метод із однаковим ім'ям. У цьому випадку реалізація має слідувати правилам сумісності сигнатури для інтерфейсів. Таким чином, можна застосовувати коваріантність та контраваріантність

Константи

Інтерфейси можуть містити константи. Константи інтерфейсів працюють так само, як і константи класів. До PHP 8.1.0 вони не могли бути перевизначені класом чи інтерфейсом, що їх успадковує.

Приклади

Приклад #1 Приклад інтерфейсу

Loading...

Приклад #2 Спадкування інтерфейсів

Loading...

Приклад #3 Сумісність із кількома інтерфейсами

Loading...

Приклад #4 Множинне наслідування інтерфейсів

Loading...

Приклад #5 Інтерфейси з константами

Loading...

Приклад #6 Інтерфейси з абстрактними класами

Loading...

Приклад #7 Одночасне розширення та впровадження

Loading...

Інтерфейс, разом із оголошеннями типів, надає відмінний спосіб перевірки те, що певний об'єкт містить певний набір методів. Дивіться також оператор instanceof і оголошення типів