Полиморфизм - это греческое слово, буквально означающее множество форм. В объектно-ориентированном программировании полиморфизм тесно связан с наследованием.
Полиморфизм позволяет объектам разных классов по-разному реагировать на одно и то же сообщение.
Для реализации полиморфизма в PHP вы можете использовать абстрактные классы или интерфейсы.
Полиморфизм помогает вам создать общую структуру, которая принимает разные типы объектов, которые используют один и тот же интерфейс.
Позже, когда вы добавляете в систему новый тип объекта, вам не нужно изменять структуру, чтобы приспособить новый тип объекта, если он реализует тот же интерфейс.
Используя полиморфизм, вы можете уменьшить взаимосвязь и повысить возможность повторного использования кода.
Сначала определите абстрактный класс с именем Person, у которого есть абстрактный метод greet().
Далее, определим классы English, German и French, которые расширяют класс Person. Метод greet() каждого класса возвращает отдельное приветственное сообщение.
<?php
// ...
class English extends Person
{
public function greet()
{
return 'Hello!';
}
}
class German extends Person
{
public function greet()
{
return 'Hallo!';
}
}
class French extends Person
{
public function greet()
{
return 'Bonjour!';
}
}
Далее, определим функцию с именем welcome(), которая принимает массив объектов Person и вызывает метод greet() каждого объекта:
<?php
//...
function greeting($people)
{
foreach ($people as $person) {
echo $person->greet() . '<br>';
}
}
В-четвертых, определим массив объектов классов English, German и French и передадим его функции greeting():
<?php
//...
$people = [
new English(),
new German(),
new French()
];
greeting($people);
Вывод:
Hello!
Hallo!
Bonjour!
Из-за конкретной реализации метода greet() в каждом классе эти объекты возвращают разные приветственные сообщения.
Следующая диаграмма классов иллюстрирует отношения между классами:
Позже, если вы захотите создать новый класс, расширяющий класс Person, вам не нужно изменять функцию greeting().
Например, вы можете определить новый класс с именем American, который расширяет класс Person:
<?php
// ...
class American extends Person
{
public function greet()
{
return 'Hi!';
}
}
И используйте объект класса American в функции greeting() следующим образом:
<?php
// ...
$people = [
new English(),
new German(),
new French(),
new American()
];
greeting($people);
Вывод:
Hello!
Hallo!
Bonjour!
Hi!
Следующий пример аналогичен предыдущему, за исключением того, что он использует интерфейс вместо абстрактного класса.
Сначала определите интерфейс с именем Greeting, в котором есть метод greet(). Метод greet() возвращает приветственное сообщение:
<?php
interface Greeting
{
public function greet();
}
Во-вторых, определите классы English, German и French, реализующие интерфейс Greeting:
<?php
// ...
class English implements Greeting
{
public function greet()
{
return 'Hello!';
}
}
class German implements Greeting
{
public function greet()
{
return 'Hallo!';
}
}
class French implements Greeting
{
public function greet()
{
return 'Bonjour!';
}
}
В-третьих, определите функцию greeting(), которая принимает массив объектов, реализующих интерфейс Greeting:
<?php
// ...
function greeting($greeters)
{
foreach ($greeters as $greeter) {
echo $greeter->greet() . '<br>';
}
}
Наконец, определите массив объектов Greeting и передайте его функции greeting():
<?php
// ...
$greeters = [
new English(),
new German(),
new French(),
];
greeting($greeters);
Вывод:
Hello!
Hallo!
Bonjour!
На следующей диаграмме классов показаны отношения между интерфейсом и классами:
Полиморфизм позволяет объектам разных классов по-разному реагировать на одно и то же сообщение.
Используйте интерфейсы или абстрактные классы для реализации полиморфизма в PHP.