Поліморфізм в php

В об'єктно-орієнтованому програмуванні поліморфізм є потужним і фундаментальним інструментом. Він може бути використаний для створення більш органічною структури програми. Даний урок описує загальне поняття поліморфізму і його додаток до PHP.

Що таке поліморфізм?

Поліморфізм - довге слово для дуже простий концепції.

Поліморфізм описує шаблон в об'єктно орієнтованому програмуванні, в якому класи мають різну функціональність при використанні загального інтерфейсу.

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

Аналогія поліморфізму в реальному світі - кнопка. Кожен знає як використовувати кнопку - потрібно просто натиснути на неї. Але те, що "робить" кнопка насправді, залежить від її з'єднань і контексту використання. Якщо хтось каже, що потрібно натиснути кнопку, то вже відомо, що потрібно зробити, щоб вирішити задачу.

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

інтерфейси

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

Інтерфейс визначається ключовим словом 'interface':

і приєднується до класу за допомогою ключового слова "implements '(кілька інтерфейсів можуть бути використані за допомогою вказівки їх один за іншим через кому):

Методи можна визначати в інтерфейсі також як і в класі, тільки без тіла функції (частини між фігурними дужками):

Всі методи, визначені в інтерфейсі, повинні бути реалізовані в реализующем інтерфейс класі. Причому методи обов'язково повинні бути публічними і в точності відповідати визначенню в інтерфейсі (дивись приклад нижче)

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

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

Абстрактний клас визначається також, як і звичайний клас, але з додаванням ключового слова 'abstract':

і він приєднується до класу за допомогою ключового слова "extends ':

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

Крок 1: Опис проблеми

Примітка: Приклади класів в даному уроці будуть використовувати угоду про найменування "пакет_компонент_Класс". Таким чином будуть розділятися класи в віртуальному просторі імен, щоб уникнути колізій.

Тепер треба додати методи для виведення інформації в різних форматах, таких як XML і JSON. Є дуже велика спокуса зробити ось так:

Але таке рішення є убогим, хоча воно і буде працювати в поточний момент. Запитайте себе, що станеться в майбутньому, коли потрібно буде додати ще який-небудь формат виведення? Ви будете редагувати клас, додаючи все більше і більше виразів case, і таким чином утяжелить код класу.

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

Крок 2: Визначаємо інтерфейс

Насамперед треба визначити інтерфейс. Дуже важливо добре продумати структуру інтерфейсу, тому що будь-які зміни коду інтерфейсу зажадають змін всіх класів, де він буде використовуватися. У нашому прикладі ми будемо використовувати простий інтерфейс для визначення одного методу:

Все дуже просто. Ми визначили публічний метод write (). який приймає в якості аргументу об'єкт статті. Будь-клас, який реалізує наш інтерфейс безумовно повинен мати метод виведення.

Порада: Якщо ви хочете обмежити тип аргументу, який буде передаватися в ваші функції і методи, ви можете використовувати явне вказівку типу аргументу, як це зроблено в методі write (). Він приймає тільки об'єкти типу poly_base_Article. На жаль, явно вказати тип значення в поточній версії PHP можна, тому потрібно бути дуже уважним з повертаються значеннями.

Крок 3: Створюємо реалізацію

Після визначення інтерфейсу потрібно створити клас, який буде виконувати ці дії. У нашому прикладі у нас є два формати, які використовуються для виведення змісту статті. Таким чином ми маємо два класи: XMLWriter і JSONWriter. Вони витягають дані з переданої статті і форматують інформацію.

Ось код XMLWriter.

У визначенні класу використовується ключове слово implements для реалізації нашого інтерфейсу. Метод write () містить код перетворення в XML.

А ось код класу JSONWriter:

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

Крок 4: Використовуємо наші реалізації

Тепер маючи визначення нових класів треба провести ревізію класу статті. Весь код, який був поміщений в оригінальний метод write (), був реалізований в наших нових класах. Всі методи повинні тепер використовувати нові класи:

Всі методи тепер використовуються через клас Writer (будь-який клас, який реалізує інтерфейс Writer), за допомогою виклику методу write (). з переданим йому $ this як аргумент, а повертається значення використовується прямо в коді. Більше не потрібно турбуватися про форматування даних і можна сконцентруватися на основному завданню.

Отримуємо об'єкт Writer

Але як отримати об'єкт Writer, який буде виконувати цей метод? Все залежить від вас, і існує багато різних стратегій. Наприклад, ви можете створити клас фабрику для перехоплення даних запиту і створення об'єкта:

В даному прикладі змінна запиту вибирає формат для використання. Ми конструюємо ім'я класу, перевіряємо його існування і повертаємо новий об'єкт Writer. А якщо сконструйованого імені не існує, то генерується виняток, щоб код клієнта міг коректно обробити ситуацію.

Крок 5: З'єднуємо всі разом

Код, який з'єднує функціональність в єдине ціле може виглядати приблизно так:

Спочатку створюється об'єкт Article. Потім ми намагаємося отримати об'єкт Writer за допомогою Factory. якщо генерується виняток то використовується формат за замовчуванням (XMLWriter). На завершення ми передаємо об'єкт Writer методу write () нашого об'єкту Article для виведення результату.

висновок

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

Поліморфізм в php

За рахунок отримання інформації відразу по двох каналах (зір і слух) ефективність навчання значно перевершує навчання по книгах. А домашні завдання і онлайн-тести дозволять вам постійно думати на мові, що вивчається і відразу перевіряти свої знання!

Поліморфізм в php

Поліморфізм в php

Якщо ви давно хочете як слід вивчити HTML, то у мене для Вас є чудова новина!

Поліморфізм в php

Якщо ви вже вивчили HTML і хочете рухатися далі, то наступним кроком буде вивчення технології CSS.

Поліморфізм в php

Якщо ви хочете розібратися з поняттями домену і хостингу, навчитися створювати бази даних, закачувати файли сайту на сервер по FTP, створювати піддомени, налаштовувати поштові скриньки для свого сайту і стежити за його відвідуваністю, то цей курс створений спеціально для вас!