Назад к вопросам
Middle
116
questionbank

Что такое полиморфизм и как он используется в программировании на PHP?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Полиморфизм — это возможность использовать один и тот же интерфейс для различных типов данных. В PHP он проявляется в нескольких формах:

  1. Наследование (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!
    
  2. Интерфейсы (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); // Выведет сумму площадей круга и квадрата
    
  3. Абстрактные классы (Abstract Class Polymorphism): Похож на полиморфизм на основе интерфейсов, но позволяет определять базовую реализацию для некоторых методов.

Полиморфизм повышает гибкость, расширяемость и поддерживаемость кода, позволяя писать обобщенные алгоритмы, работающие с коллекциями объектов различных типов через единый интерфейс.