Что такое полиморфизм и как он используется в программировании на PHP?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Полиморфизм — это возможность использовать один и тот же интерфейс для различных типов данных. В PHP он проявляется в нескольких формах:
-
Наследование (Subtype Polymorphism): Дочерние классы могут переопределять методы родительского класса, предоставляя свою реализацию. При вызове метода на объекте базового типа на самом деле будет выполнен метод из конкретного дочернего класса, в зависимости от типа объекта.
<?php class Animal { public function makeSound() { echo "Generic animal sound\n"; } } class Dog extends Animal { public function makeSound() { echo "Woof!\n"; } } class Cat extends Animal { public function makeSound() { echo "Meow!\n"; } } function makeAnimalSound(Animal $animal) { $animal->makeSound(); // Вызывается метод соответствующего подтипа } $dog = new Dog(); $cat = new Cat(); makeAnimalSound($dog); // Вывод: Woof! makeAnimalSound($cat); // Вывод: Meow! -
Интерфейсы (Interface Polymorphism): Различные классы могут реализовывать один и тот же интерфейс, обещая предоставлять определенный набор методов с одинаковой сигнатурой. Это позволяет работать с объектами разных классов через единый интерфейс.
<?php interface Shape { public function getArea(); } class Circle implements Shape { private $radius; public function __construct($radius) { $this->radius = $radius; } public function getArea() { return pi() * $this->radius * $this->radius; } } class Square implements Shape { private $side; public function __construct($side) { $this->side = $side; } public function getArea() { return $this->side * $this->side; } } function calculateTotalArea(array $shapes) { $totalArea = 0; foreach ($shapes as $shape) { if ($shape instanceof Shape) { // Проверка на соответствие интерфейсу $totalArea += $shape->getArea(); } } return $totalArea; } $shapes = [new Circle(5), new Square(4)]; echo calculateTotalArea($shapes); // Выведет сумму площадей круга и квадрата -
Абстрактные классы (Abstract Class Polymorphism): Похож на полиморфизм на основе интерфейсов, но позволяет определять базовую реализацию для некоторых методов.
Полиморфизм повышает гибкость, расширяемость и поддерживаемость кода, позволяя писать обобщенные алгоритмы, работающие с коллекциями объектов различных типов через единый интерфейс.