Абстрактні класи та інтерфейси в php, блог веб-розробників

Абстрактні класи та інтерфейси в php, блог веб-розробників

Давним-давно, коли абстрактних класів і інтерфейсів в php не було, це можна було зробити приблизно ось так:

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

абстрактні класи

Примірник абстрактного класу створювати не можна, тому що в противному випадку могла статися спроба викликати від цього примірника абстрактний метод, що абсурдно, так як він не має реалізації.

Тепер клас, успадкований від класу Animal. зобов'язаний буде містити реалізацію методу say або повинен бути оголошений абстрактним, в іншому випадку ще до початку виконання скрипта відбудеться помилка.

/ * * Fatal error: Class Cat contains 1 abstract method * and must therefore be declared abstract or implement * the remaining methods (Animal :: say) * / class Cat extends Animal name = $ name; >>

В абстрактному класі можна оголошувати так само і звичайні методи і поля, які можуть бути успадковані. Незважаючи на те, що абстрактний клас не може мати екземплярів, він може мати конструктор, який можуть використовувати для ініціалізації його полів нащадки. Додамо поле, що зберігають кличку тварини, гетер для її отримання та конструктор в клас Animal.

Давайте успадкуємо від нашого абстрактного класу Animal ще й клас Dog. описує собаку, і додамо в нього, і в клас Cat реалізації методу Say. Зверніть увагу, що в конструкторах цих класів викликаються конструктор абстрактного класу-предка.

Можливо, вам здається дивним, що на спадкоємців абстрактного класу накладаються додаткові обмеження, але насправді ці обмеження відіграють нам тільки на руку. Створюючи екземпляр класу-спадкоємця абстрактного класу можна бути повністю впевненим у тому, що він реалізував функціонал, описаний в абстрактному класі і тепер, щоб бути впевненим в наявності необхідного методу у екземпляра класу, можна просто засвідчуватися в тому, що він є спадкоємцем абстрактного класу, в якому описаний потрібний нам метод. Для цього можна використовувати або оператор instanceof. або уточнити тип прийнятого методом аргументу.

інтерфейси

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

Нехай наш клас Animal. який вже не містить метод say. буде імплементувати інтерфейс CanSay. Класи Dog і Cat при цьому залишаться його спадкоємцями класу Animal.

Тепер для того, щоб перевірити, що об'єкт може говорити, потрібно впевнитися що клас, якому він належить, реалізує інтерфейс CanSay. Зробити це можна вказавши в якості типу потрібного аргументу методу ім'я інтерфейсу, або використавши оператор instanceof.
Перенесення абстрактного методу say в окремий клас зробив наш код більш розширюваним. Тепер можна реалізувати інтерфейс CanSay і в інших класах, які не є спадкоємцями класу Animal. і той функціонал, якому було потрібно, щоб об'єкти, якими він оперує, вміли говорити (реалізовували інтерфейс CanSay), не зміниться.

Варто так само відзначити ще одна відмінність інтерфейсів від абстрактних класів - один клас може реалізовувати як завгодно багато інтерфейсів. Для цього їх імена просто потрібно перерахувати через кому після ключового слова implements. Успадкувати ж кілька абстрактних класів не можна. Це пов'язано з тим, що в абстрактних класах можуть міститися різні реалізації не абстрактних методів з однаковими іменами, і при спадкуванні цих класів не ясно, яку реалізацію успадкувати нащадку. У інтерфейсах ж реалізовані методи відсутні і, якщо клас імплементує кілька інтерфейсів, в яких міститися абстрактні методи з однаковими іменами, то який з цих методів буде реалізований в класі байдуже.
У більш широкому сенсі під інтерфейсом часто розуміють просто функціонал, відірваний від реалізації, тобто те, що щось вміє робити і неважливо як воно це робить.

На цьому я закінчу розповідати вам про високі абстракції. Як завжди бажаю вам успіхів!

Прочитаю на дозвіллі ...!
Спс