I Trait: Collisione tra nomi di metodi e aliasing - OOP in PHP

I Trait: Collisione tra nomi di metodi e aliasing - OOP in PHP

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!
?>

Scritto da Donato Pirolo

Ciao, sono Donato, frontend developer con una smisurata passione per la SEO. Creo strumenti ad hoc per aiutare aziende e professionisti ad essere cercati sul web e trovare clienti.

Potrebbero interessarti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Copyright © 2023
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram