I Trait: Collisione tra nomi di metodi e aliasing - OOP in PHP
Indice
Cos'è la collisione tra i nomi dei metodi
La collisione dei nomi si verifica quando due trait utilizzati in una stessa classe hanno un metodo con lo stesso nome. In questo caso, si verifica un conflitto perché PHP non sa quale metodo utilizzare quando si chiama il metodo con lo stesso nome. Invece di risolvere questo conflitto creando una gerarchia di classi complessa, è possibile risolvere la collisione dei nomi utilizzando l'aliasing dei metodi.
Cos'è l'aliasing
L'aliasing è un processo che consente di rinominare un metodo all'interno della classe che utilizza i trait, in modo da risolvere il conflitto dei nomi. Ciò significa che è possibile definire un nuovo nome per un metodo di un trait all'interno della classe che utilizza i trait, in modo da evitare che il nome del metodo sia in conflitto con altri metodi definiti in altri trait.
Sintassi di un aliasing per risolvere il problema di collisione tra nomi
La sintassi per definire un trait in PHP è la seguente:
trait NomeTrait1 {
public function metodo1() {
echo "Questo è " . __METHOD__ . "\n";
}
}
trait NomeTrait2 {
public function metodo1() {
echo "Questo è " . __METHOD__ . "\n";
}
}
class NomeClasse {
use NomeTrait1,NomeTrait2 {
NomeTrait1::metodo1 insteadOf NomeTrait2;
NomeTrait2::metodo1 as NuovoNome;
}
// altri metodi e proprietà
}
$obj = new NomeClasse();
$obj->metodo1(); // Questo è NomeTrait1::metodo1
$obj->NuovoNome(); // Questo è NomeTrait2::metodo1
Esempio utilizzando l'aliasing per risolvere il conflitto tra i nomi dei metodi.
<?php
/* Per creare il problema di più collisione tra i metodi
creiamo 3 trait aventi un metodo che si chiama nello
stesso modo in tutti e 3 i trait
*/
trait Accelerazione {
public function azione() {
echo "Sto accelerando!";
}
}
trait Frenata {
public function azione() {
echo "Sto frenando!";
}
}
trait Cambio {
public function azione() {
echo "Sto cambiando marcia!";
}
}
// Creiamo una classe che contiene tutti e 3 i trait
class Auto {
// Importiamo i 3 trait all'interno della nostra classe
use Accelerazione, Frenata, Cambio {
/* Usiamo il nome del trait che utilizzerà il metodo con il suo nome
ed avrà precedenza rispetto agli altri trait che andremo ad indicare.
A seguire: lo scope resolution operator (::) , la keyword insteadof
ed il nome degli altri due trait a cui verrà sottratto il diritto
di usare il nome della funzione
*/
Accelerazione::azione insteadof Frenata, Cambio;
/* Rinominiamo il metodo azione() indicando il nome del trait, lo scope
resolution operator, la keyword as ed il NUOVO NOME (aliasing) del metodo
*/
Frenata::azione as frena;
Cambio::azione as cambia;
}
public function guida() {
return $this->azione();
return $this->frena();
return $this->cambia();
}
}
// Utilizzo della classe Auto
$auto = new Auto();
echo $auto->azione(); // Stampa "Sto accelerando!"
echo $auto->frena(); // Sto frenando!
echo $auto->cambia(); // Sto cambiando marcia!
?>