Cos'è il polimorfismo e come viene utilizzato nella programmazione PHP?
sobes.tech AI
Risposta dell'AI
Il polimorfismo è la capacità di utilizzare un'interfaccia comune per diversi tipi di dati. In PHP si manifesta in diverse forme:
-
Ereditarietà (Polimorfismo per sottotipo): Le classi figlie possono ridefinire i metodi della classe padre, fornendo la propria implementazione. Quando si chiama un metodo su un oggetto di tipo base, in realtà viene eseguito il metodo della classe figlia specifica, a seconda del tipo dell'oggetto.
<?php class Animal { public function makeSound() { echo "Suono generico dell'animale\n"; } } class Dog extends Animal { public function makeSound() { echo "Bau!\n"; } } class Cat extends Animal { public function makeSound() { echo "Miao!\n"; } } function makeAnimalSound(Animal $animal) { $animal->makeSound(); // Chiamata al metodo del sottotipo specifico } $dog = new Dog(); $cat = new Cat(); makeAnimalSound($dog); // Output: Bau! makeAnimalSound($cat); // Output: Miao! -
Interfacce (Polimorfismo tramite interfaccia): Classi diverse possono implementare la stessa interfaccia, promettendo di fornire un insieme definito di metodi con la stessa firma. Questo permette di lavorare con oggetti di classi diverse tramite un'interfaccia comune.
<?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) { // Verifica l'interfaccia $totalArea += $shape->getArea(); } } return $totalArea; } $shapes = [new Circle(5), new Square(4)]; echo calculateTotalArea($shapes); // Mostra la somma delle aree di cerchio e quadrato -
Classi astratte (Polimorfismo tramite classe astratta): Simile al polimorfismo basato su interfacce, ma permette di definire un'implementazione di base per alcuni metodi.
Il polimorfismo aumenta la flessibilità, l'estensibilità e la manutenibilità del codice, consentendo di scrivere algoritmi generici che lavorano con collezioni di oggetti di diversi tipi tramite un'interfaccia comune.