Какво е полиморфизъм и как се използва в програмирането на PHP?
sobes.tech AI
Отговор от AI
Полиморфизмът е възможността да използвате един и същ интерфейс за различни типове данни. В PHP той се проявява в няколко форми:
-
Наследяване (Subtype Polymorphism): Дъщерните класове могат да презапишат методите на родителския клас, предоставяйки своя собствена реализация. При извикване на метод на обект от базов тип, всъщност ще бъде изпълнен методът от конкретния дъщерен клас, в зависимост от типа на обекта.
<?php class Animal { public function makeSound() { echo "Общ звук на животно\n"; } } class Dog extends Animal { public function makeSound() { echo "Ррр!\n"; } } class Cat extends Animal { public function makeSound() { echo "Мяу!\n"; } } function makeAnimalSound(Animal $animal) { $animal->makeSound(); // Извиква се методът на съответния подтип } $dog = new Dog(); $cat = new Cat(); makeAnimalSound($dog); // Изход: Ррр! makeAnimalSound($cat); // Изход: Мяу! -
Интерфейси (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): Подобно на полиморфизма на базата на интерфейси, но позволява да се дефинира базова реализация за някои методи.
Полиморфизмът увеличава гъвкавостта, разширяемостта и поддръжката на кода, като позволява писането на обобщени алгоритми, работещи с колекции от обекти от различни типове чрез единен интерфейс.