Полиморфизъм в PHP

В обектно-ориентираното програмиране полиморфизмът е мощен и основен инструмент. Може да се използва за създаване на по-органична структура за вашето приложение. Този урок описва общата концепция за полиморфизма и приложението му към PHP.

Какво е полиморфизъм?

Полиморфизмът е дълга дума за много проста концепция.

Полиморфизмът описва модел в обектно ориентирано програмиране, при който класовете имат различна функционалност при използване на общ интерфейс.

Красотата на полиморфизма е, че можете да работите с различни класове във вашия код и не е нужно да знаете кой клас се използва, тъй като те имат един и същ интерфейс.

Аналогията на полиморфизма в реалния свят е бутон. Всеки знае как да използва бутон - просто трябва да го натиснете. Но какво всъщност „прави“ един бутон зависи от неговите връзки и контекста на употреба. Ако някой каже, че трябва да натиснете бутон, тогава вече знаете какво трябва да се направи, за да се реши проблемът.

В света на програмирането полиморфизмът се използва за създаване на модулни структури на приложения и улесняване на разширяването на функционалността. Вместо да използвате смесица от условия, описващи различни опции, можете да създадете взаимозаменяеми обекти, които са избрани въз основа на условията на употреба. Това е основната цел на използването на полиморфизма.

Интерфейси

Неразделна част от полиморфизма е общият интерфейс. Има два начина за дефиниране на интерфейс в PHP: интерфейс и абстрактен клас. И двата метода имат собствено предназначение, могат да се използват заедно или можете да изберете този, който най-добре отговаря на йерархията на класа.

Интерфейсът се определя от ключовата дума „интерфейс“:

и е прикрепен към класа с помощта на ключовата дума ‘implements’ (могат да се използват множество интерфейси, като се посочват един след друг, разделени със запетаи):

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

Всички методи, дефинирани в интерфейса, трябва да бъдат внедрени в класа, който реализира интерфейса. Освен това методите трябва да са публични и да съответстват точно на дефиницията в интерфейса (вижте примера по-долу)

Абстрактен клас

Абстрактният клас е смесица от интерфейс и обикновен клас. Той може да дефинира функционалност, както и интерфейс (под формата на абстрактни методи). Клас, който разширява абстрактния клас, трябва да съдържа изпълнението на всички абстрактни методи, дефинирани в абстрактния клас.

Абстрактният клас се дефинира по същия начин като обикновения клас, но с добавянето на ключовата дума ‘abstract’:

и е прикрепен към класа с помощта на ключовата дума ‘extends’:

Регулярните методи се дефинират в абстрактния клас, както в обикновения клас, а абстрактните методи се дефинират с помощта на ключовата дума ‘abstract’. Абстрактните методи се използват по същия начин, както в интерфейса и трябва да бъдат внедрени в разширения клас.

Стъпка 1: Описание на проблема

Забележка: Примерите за класове в този урок ще използват конвенцията за именуване “package_component_Class”. Това ще отдели класовете във виртуалното пространство от имена, за да се избегнат сблъсъци.

Сега трябва да добавим методи за извеждане на информация в различни формати като XML и JSON. Има много голямо изкушение да направите това:

Но такова решение е лошо, въпреки че ще работи в момента. Задайте си въпроса какво ще се случи в бъдеще, когато трябва да добавите още изходен формат? Ще редактирате класа, като добавяте все повече и повече отчети и по този начин ще утежнявате кода на класа.

Един от принципите на обектно ориентираното програмиране казва, че класът трябва да извърши една операция, но трябва да го направи много добре.

Стъпка 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-филтър

Що се отнася до сигурността на уебсайта, фразата „филтрирайте всичко, екранирайте всичко“ винаги ще бъде от значение. Нека да поговорим за филтриране на данни днес.

Контекстното бягство със zend-escape

Свързване на Zend модули към Expressive

Expressive 2 поддържа възможността за свързване на други ZF компоненти по специален начин. Не всички харесват това решение. В тази статия ще ви разкажем как подобрихме процеса на свързване на множество модули.

Съвет: изпращане на информация до Google Analytics чрез API

Да приемем, че трябва да изпратите информация до Google Analytics от скрипт от страна на сървъра. Как да го направя. Отговорете в тази бележка.

Избор от PHP пясъчници

Избор от няколко вида PHP пясъчници. На някои можете да тествате кода си онлайн, но има и решения, които могат да бъдат внедрени на вашия уебсайт.