Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 13 di 50
  • livello avanzato
Indice lezioni

Polimorfismo, Overloading e Late-Binding

Analizziamo le metodologie di PHP per l'implementazione del meccanismo chiamato polimorfismo, tipico della programmazione object oriented; una soluzione realizzabile tramite la risoluzione dei metodi che si rivela ideale per la creazione di codice riutilizzabile.
Analizziamo le metodologie di PHP per l'implementazione del meccanismo chiamato polimorfismo, tipico della programmazione object oriented; una soluzione realizzabile tramite la risoluzione dei metodi che si rivela ideale per la creazione di codice riutilizzabile.
Link copiato negli appunti

Un altro elemento fondamentale nella programmazione ad oggetti basata sull'ereditarietà, è il polimorfismo. Insieme all'incapsulamento e all'ereditarietà quest'ultimo fa parte dei concetti fondamentali del paradigma object oriented, i quali, facilitano il riutilizzo e la flessibilità del codice.

Nella programmazione, quando si parla di polimorfismo, si intende la possibilità di accedere a più funzioni tramite la stessa interfaccia. Quindi, una stessa funzione, potrebbe comportarsi in modo diverso a seconda del contesto in cui viene eseguita. Questo succede perché l'ereditarietà, come visto nei capitoli precedenti, consente alle sottoclassi di ridefinire i metodi ereditati dalla classe base.

È possibile ottenere il polimorfismo mediante due procedure: con metodi in Overloading (early binding) o tramite l'ereditarietà (late binding).

Overloading

Il polimorfismo, si realizza attraverso le operazioni di overloading, che consistono fondamentalmente nel definire più metodi con lo stesso nome ma dedicati a oggetti diversi; a tal proposito si analizzi il seguente esempio:

<?php
class Mammifero {
	public function speak(){
		echo "";
		}
}
class Cane extends Mammifero {
	public function speak(){
		echo  "<br>"."Bau Bau";
		}
}
class Persona extends Mammifero {
	public function speak(){
		echo "<br>"."Hello";
	}
}
function callSpeak($tipologia)
	{
	//se un oggetto è un'istanza della classe Mammifero
	if ($tipologia == "cane") {
		$mamm = new Cane();
	} elseif($tipologia == "persona") {
		$mamm = new Persona();
	}
     	return $mamm;
}
// scelta del mammifero da istanziare
$tipologia = "cane";
// test() crea e restituisce un nuovo mammifero in base alla variabile $tipologia
$test = callSpeak($tipologia);
$test->speak();
?>

Come possiamo notare, le sottoclassi precedenti (cane e persona) sono polimorfiche. Infatti, anche se appartenenti alla stessa classe Mammifero, reagiscono in modo diverso ogni qualvolta viene utilizzato il metodo speak(). Quindi, solo in fase di esecuzione è possibile stabilire quale sia il metodo corretto da invocare a seconda della classe di cui l'oggetto è istanza.

Late Binding

Come impostazione predefinita, i metodi sono risolti staticamente al momento della compilazione (binding statico). Mentre, la risoluzione, durante l'esecuzione del metodo da invocare, viene chiamata late binding (o binding dinamico).

Il polimorfismo con Late Binding, ottenuto tramite l'ereditarietà delle classi, permette di stabilire, in fase di esecuzione, qual'è il metodo più corretto da utilizzare a seconda della classe di cui l'oggetto è istanza. Insomma, il late Binding, offre ulteriore flessibilità al meccanismo del polimorfismo.

<?php
class Mammifero {
	protected function speak(){
		echo "";
	}
	public function call() {
		$this->speak();
	}
}
class Cane extends Mammifero {
	protected function speak(){
		echo  "<br>"."Bau Bau";
	}
}
class Persona extends Mammifero {
	protected function speak(){
		echo "<br>"."Hello";
	}
}
function callSpeak(Mammifero $oggetto){
	$oggetto->call();
}
callSpeak(new Cane()); // Bau Bau
callSpeak(new Persona()); // Hello
?>

Dall'esempio, possiamo notare come call() utilizzi il metodo protetto speak(). In questo caso, call(), viene ereditata dalle sottoclassi e utilizza il metodo speak() implementato nelle sottoclassi e non come viene definito nella superclasse Mammifero().

Il nostro programma, in fase di esecuzione, aspetta di sapere da quale istanza viene eseguito il metodo call() prima di decidere quale versione di speak() eseguire. Quindi la decisione sul metodo da richiamare viene presa in maniera dinamica in fase di esecuzione (late binding o binding dinamico).

Ti consigliamo anche