Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое полиморфизм в ООП?
Полиморфизм (от греч. «poly» — много, «morph» — форма) — это способность объекта принимать несколько форм или один интерфейс использовать по-разному в зависимости от контекста. В PHP есть несколько видов полиморфизма.
Параметрический полиморфизм (Ad-hoc Polymorphism)
Это способность одной функции работать с разными типами данных. В PHP реализуется через перегрузку методов или различные типы параметров:
interface Logger {
public function log($message);
}
class FileLogger implements Logger {
public function log($message) {
file_put_contents('log.txt', $message . PHP_EOL, FILE_APPEND);
}
}
class DatabaseLogger implements Logger {
public function log($message) {
// сохранение в БД
}
}
function writeLog(Logger $logger, string $message) {
$logger->log($message);
}
Полиморфизм включения (Subtype Polymorphism)
Это наиболее распространённый вид — использование наследования и интерфейсов:
class Animal {
public function speak() {
return "Some sound";
}
}
class Dog extends Animal {
public function speak() {
return "Bark!";
}
}
class Cat extends Animal {
public function speak() {
return "Meow!";
}
}
$animals = [new Dog(), new Cat(), new Animal()];
foreach ($animals as $animal) {
echo $animal->speak() . "\n";
}
// Bark!
// Meow!
// Some sound
Каждый объект интерпретируется как Animal, но поведение зависит от его реального типа.
Параметризованный полиморфизм (Generics)
При помощи типов можно создавать обобщённый код:
/** @template T */
class Container {
/** @var T */
private $item;
/** @param T $item */
public function set($item): void {
$this->item = $item;
}
/** @return T */
public function get() {
return $this->item;
}
}
$container = new Container();
$container->set("hello");
echo $container->get(); // hello
Динамический полиморфизм (Duck Typing)
PHP позволяет работать с объектами по их методам, не проверяя явный тип:
function quack($object) {
if (method_exists($object, 'quack')) {
$object->quack();
}
}
Преимущества
- Гибкость — легко добавлять новые типы без изменения кода
- Тестируемость — простая подмена реальных объектов на моки
- Масштабируемость — архитектура остаётся чистой при расширении
- Переиспользование кода — один метод работает с разными типами
Полиморфизм — ключевой инструмент для написания гибкого, расширяемого кода, соответствующего принципам SOLID.