PHP ci consente di sfruttare le potenzialità del Polimorfismo, una tecnica di programmazione orientata agli oggetti e basata
sull'ereditarietà.
Il Polimorfismo è la capacità di utilizzare un unico metodo in grado di comportarsi in modo specifico quando
applicato a tipi di dato differenti.
Questo è reso possibile grazie all'ereditarietà, che consente alle
sottoclassi di ridefinire i metodi ereditati dalla classe base.
Il linguaggio può identificare una qualunque istanza della sottoclasse, come un'istanza della classe base, poichè per il principio
dell'ereditarietà, ogni sottoclasse possiede per natura tutte le proprietà della classe base (attributi e metodi).
Vedremo ora due classi normali, senza l'utilizzo di ereditarietà e polimorfismo, che implementeremo successivamente :
Esempio senza Polimorfismo
<?php
class Cane
{
function zampeCane()
{
echo "Zampe : 4";
}
}
class Gallina
{
function zampeGallina()
{
echo "Zampe : 2";
}
}
function numeroZampe($oggetto)
{
if ($oggetto instanceof Cane) // Condizione = Se oggetto è un istanza della classe Cane
{
$oggetto->zampeCane();
}
else if ($oggetto instanceof Gallina)
{
$oggetto->zampeGallina();
}
else
{
echo "Tipo di oggetto non riconosciuto!!";
}
}
numeroZampe(new Cane()); // Stampa : "Zampe : 4"
numeroZampe(new Gallina()); // Stampa : "Zampe : 2"
?>
Ora riscriverò il codice dell'esempio soprastante utilizzando il polimorfismo
Esempio con Polimorfismo
<?php
class Animale
{
/* Rendiamo protetto il metodo per obbligare una redefinizione in una
sottoclasse necessaria a sbloccare l'utilizzo del metodo dall'esterno.
Più avanti per ottenere un risultato migliore useremo le Classi Astratte. */
protected function zampe()
{
echo "Errore : la funzione va obbligatoriamente ridefinita da una sottoclasse!";
}
}
class Cane extends Animale
{
public function zampe()
{
echo "Zampe : 4";
}
}
class Gallina extends Animale
{
public function zampe()
{
echo "Zampe : 2";
}
}
function numeroZampe($oggetto)
{
if ($oggetto instanceof Animale) // Condizione = Se oggetto è un istanza di Animale o derivata da essa
{
$oggetto->zampe();
}
else
{
echo "Tipo di oggetto non riconosciuto!!";
}
}
numeroZampe(new Cane()); // Stampa : "Zampe : 4"
numeroZampe(new Gallina()); // Stampa : "Zampe : 2"
?>
|
| Nel secondo esempio possiamo notare innanzitutto che abbiamo stabilito un nome univoco
per il nostro metodo ("zampe()"), ereditato direttamente dalla classe base Animale.
Altro punto di forza è la flessibiità ottenuta nella funzione esterna numeroZampe(), che sarà in grado di gestire anche altri
classi oltre a Cane e Gallina, che potremo definire anche in un secondo momento senza necessità alcuna di apportare modifiche alla
funzione numeroZampe() o alle tre classi (Animale, Cane e Gallina). |
Nota : l'operatore instanceof si comporta come un normale operatore logico binario, e viene impiegato per individuare
se un'istanza è della classe specificata o derivata da essa.