Полиморфизъм в PHP
В обектно-ориентираното програмиране полиморфизмът е мощен и основен инструмент. Може да се използва за създаване на по-органична структура за вашето приложение. Този урок описва общата концепция за полиморфизма и приложението му към PHP.
Какво е полиморфизъм?
Полиморфизмът е дълга дума за много проста концепция.
Полиморфизмът описва модел в обектно ориентирано програмиране, при който класовете имат различна функционалност при използване на общ интерфейс.
Красотата на полиморфизма е, че можете да работите с различни класове във вашия код и не е нужно да знаете кой клас се използва, тъй като те имат един и същ интерфейс.
Аналогията на полиморфизма в реалния свят е бутон. Всеки знае как да използва бутон - просто трябва да го натиснете. Но какво всъщност „прави“ един бутон зависи от неговите връзки и контекста на употреба. Ако някой каже, че трябва да натиснете бутон, тогава вече знаете какво трябва да се направи, за да се реши проблемът.
В света на програмирането полиморфизмът се използва за създаване на модулни структури на приложения и улесняване на разширяването на функционалността. Вместо да използвате смесица от условия, описващи различни опции, можете да създадете взаимозаменяеми обекти, които са избрани въз основа на условията на употреба. Това е основната цел на използването на полиморфизма.
Интерфейси
Неразделна част от полиморфизма е общият интерфейс. Има два начина за дефиниране на интерфейс в PHP: интерфейс и абстрактен клас. И двата метода имат собствено предназначение, могат да се използват заедно или можете да изберете този, който най-добре отговаря на йерархията на класа.
Интерфейсът се определя от ключовата дума „интерфейс“:
и е прикрепен към класа с помощта на ключовата дума ‘implements’ (могат да се използват множество интерфейси, като се посочват един след друг, разделени със запетаи):
Методите могат да бъдат дефинирани както в интерфейса, така и в класа, само без тялото на функцията (части между фигурните скоби):
Всички методи, дефинирани в интерфейса, трябва да бъдат внедрени в класа, който реализира интерфейса. Освен това методите трябва да са публични и да съответстват точно на дефиницията в интерфейса (вижте примера по-долу)
Абстрактен клас
Абстрактният клас е смесица от интерфейс и обикновен клас. Той може да дефинира функционалност, както и интерфейс (под формата на абстрактни методи). Клас, който разширява абстрактния клас, трябва да съдържа изпълнението на всички абстрактни методи, дефинирани в абстрактния клас.
Абстрактният клас се дефинира по същия начин като обикновения клас, но с добавянето на ключовата дума ‘abstract’:
и е прикрепен към класа с помощта на ключовата дума ‘extends’:
Регулярните методи се дефинират в абстрактния клас, както в обикновения клас, а абстрактните методи се дефинират с помощта на ключовата дума ‘abstract’. Абстрактните методи се използват по същия начин, както в интерфейса и трябва да бъдат внедрени в разширения клас.
Стъпка 1: Описание на проблема
Забележка: Примерите за класове в този урок ще използват конвенцията за именуване “package_component_Class”. Това ще отдели класовете във виртуалното пространство от имена, за да се избегнат сблъсъци.
Сега трябва да добавим методи за извеждане на информация в различни формати като XML и JSON. Има много голямо изкушение да направите това:
Но такова решение е лошо, въпреки че ще работи в момента. Задайте си въпроса какво ще се случи в бъдеще, когато трябва да добавите още изходен формат? Ще редактирате класа, като добавяте все повече и повече отчети и по този начин ще утежнявате кода на класа.