Поліморфізм у 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. У прикладі був показаний один із можливих способів потенційного використання поліморфізму. Він є елегантним способом уникнути використання громіздких умовних виразів в об'єктно орієнтованому коді. поліморфізм допомагає слідувати принципу поділу компонентів і є інтегральною частиною багатьох шаблонів програмування.

Даний урок підготовлений для вас командою сайту ruseller.com Джерело уроку: net.tutsplus.com/tutorials/php/understanding-and-applying-polymorphism-in-php/ Переклав: Сергій Фастунов Урок створений : 20 Вересня 2010 Переглядів: 39804 Правила передруку

5 останніх уроків рубрики "PHP"

Фільтрування даних за допомогою zend-filter

Коли йдеться про безпеку веб-сайту, фраза "фільтруйте все, екрануйте все" завжди буде актуальною. Сьогодні поговоримо про фільтрацію даних.

Контекстне екранування за допомогою zend-escaper

Підключення Zend модулів до Expressive

Expressive 2 підтримує можливість підключення інших компонентів ZF за спеціальною схемою. Не всім подобається це рішення. У цій статті ми розповімо, як покращили процес підключення кількох модулів.

Порада: надсилання інформації в Google Analytics через API

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

Підбірка PHP пісочниць

Добірка з декількох видів PHPпісочниць. На деяких ви в режимі online зможете потішити свій код, але є рішення, які можна впровадити на свій сайт.