I trait - OOP in PHP
Indice
Cosa sono i trait?
I trait sono una tecnica per riutilizzare il codice che consente di definire un insieme di metodi che possono essere utilizzati da diverse classi in modo indipendente.
In altre parole, i trait consentono di definire un gruppo di metodi che possono essere utilizzati da più classi senza dover creare una gerarchia di classi complessa. Ciò significa che i trait sono utili quando si desidera riutilizzare il codice in più classi senza creare una catena di ereditarietà che potrebbe rendere il codice meno leggibile e difficile da mantenere.
Ad esempio, supponiamo di avere tre classi: "Automobile", "Camion" e "Moto". Ognuna di queste classi ha bisogno di un metodo "accelera". Invece di definire un metodo "accelera" in ogni classe, possiamo definire un trait "Accelerazione" che ha il metodo "accelera", e quindi utilizzare il trait in ciascuna delle tre classi.
Questo ci consente di riutilizzare il codice in modo efficiente, evitando la necessità di creare una gerarchia di classi complessa solo per condividere un insieme di metodi comuni.
Sintassi di un trait
La sintassi per definire un trait in PHP è la seguente:
trait NomeTrait {
// definizione dei metodi del trait
public function metodo1() {
// corpo del metodo 1
}
public function metodo2() {
// corpo del metodo 2
}
}
Come utilizzare trait in una classe?
Per utilizzare un trait all'interno di una classe in PHP, è necessario utilizzare la parola chiave "use" seguita dal nome del trait. La sintassi generale per l'utilizzo di un trait in una classe è la seguente:
class NomeClasse {
use NomeTrait;
// altri metodi e proprietà
}
Esempio utilizzando classi e metodi astratti
<?php
/* i trait consentono di definire un gruppo di metodi che possono essere utilizzati da più classi
senza dover creare una gerarchia di classi complessa. Ciò significa che i trait sono utili quando
si desidera riutilizzare il codice in più classi senza creare una catena di ereditarietà che potrebbe
rendere il codice meno leggibile e difficile da mantenere.
*/
trait Accelerazione {
public $secondi;
public function zero_Cento(int|float $secondi){
return "Abbiamo raggiunto i 100 km/h in : " . $secondi . " secondi";
}
}
class Auto{
// per invocare un trait usiamo la parola chiave use seguita dal nome del trait.
use Accelerazione;
public function autoAccelera($secondi){
/* possiamo invocare direttamente il trait con $this poichè il trait funziona come
se stessimo facendo copia e incolla del codice all'interno della classe.
*/
return $this->zero_Cento($secondi) . " in " . __CLASS__;
}
}
class Moto{
use Accelerazione;
public function motoAccelera($secondi){
return $this->zero_Cento($secondi) . " in " . __CLASS__;
}
}
class Aereo{
use Accelerazione;
public function aereoAccelera($secondi){
return $this->zero_Cento($secondi) . " in " . __CLASS__;
}
}
$auto = new Auto();
$moto = new Moto();
$aereo = new Aereo();
echo $auto->autoAccelera(6.7) . "\n"; // output : Abbiamo raggiunto i 100 km/h in : 6.7 secondi in Auto
echo $moto->motoAccelera(4.2) . "\n"; // output : Abbiamo raggiunto i 100 km/h in : 6.7 secondi in Moto
echo $aereo->aereoAccelera(1.7) . "\n"; // output : Abbiamo raggiunto i 100 km/h in : 6.7 secondi in Aereo
?>