← Назад к вопросам

Что такое полиморфизм в ООП?

1.0 Junior🔥 171 комментариев
#ООП

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое полиморфизм в ООП?

Полиморфизм (от греч. «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.