Полиморфизъм в 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 пясъчници. На някои можете да тествате кода си онлайн, но има и решения, които могат да бъдат внедрени на вашия уебсайт.
- Упътване за играта UmaNetto
- Папие-маше е
- Представители на сродни професии ще намерят място в националния регистър на строителите, Информация
- Идеи за проспериращ свят или 101 ключа към вашия просперитет
- Търсете платени клиники в Москва по име (адреси, цени, онлайн резервации)