
Ti stai chiedendo «quando conviene creare un trait?», quali sono i vantaggi e quali gli svantaggi? Oppure semplicemente non sai che cos’è un trait in PHP: in quel caso ti consiglio di leggere l’articolo che ho scritto sull’argomento.
Le poche volte in cui ho creato un trait è stato per costruire widget Elementor o Prestashop. Quando crei un widget Elementor, per esempio, quel widget eredita già da una classe: non ho nessuna voglia di scrivere una classe che eredita da un’altra, che eredita da un’altra ancora, solo per mettere in comune due o tre metodi. È lì che entra in gioco il trait, che mi permette proprio di condividere quei metodi. In fondo, per semplificare, un trait equivale a un copia-incolla.
trait CarouselTrait
{
public function getScriptDepends()
{
return ['swiper'];
}
protected function registerCarouselSection(array $args = [])
{
// Resto del codice per mostrare le opzioni
// di configurazione in Elementor
}
}
I vantaggi di un trait in PHP
-
Se vuoi riutilizzare del codice fra più classi, il trait è un’alternativa all’estensione della classe. In questo caso può essere l’opzione migliore, perché non fa parte della gerarchia dei tipi: una classe che usa un trait non è “un’istanza di quel trait”.
-
Un trait ti risparmia un copia-incolla manuale offrendoti un copia-incolla alla compilazione.
Gli svantaggi di un trait in PHP
D’altra parte i trait pongono diversi problemi. Per esempio:
-
Quando un trait aggiunge uno o più metodi pubblici a una classe, spesso servirebbe dichiarare quei metodi in un’interfaccia che la classe implementa automaticamente usando il trait. Non è possibile: un trait non può implementare un’interfaccia. Devi quindi usare il trait e implementare l’interfaccia in modo esplicito.
-
I trait non hanno metodi e proprietà “privati” tutti loro. Mi capita spesso di voler nascondere qualcosa alla classe che usa il trait, ma renderlo “privato” è impossibile. Tutto ciò che nel trait è definito come privato resta comunque accessibile dalla classe che lo usa. Un trait non può quindi incapsulare nulla.
Quali sono le alternative ai trait in PHP
In ogni caso, nella pratica un’alternativa al trait si trova sempre. Eccone un paio:
-
Se il trait ha responsabilità da servizio, meglio trasformarlo in un vero servizio, che può e deve essere iniettato come argomento del costruttore nel servizio che ne ha bisogno. È quello che si chiama comportamento componibile ( o composing behavior ) invece di ereditare un comportamento. Lo stesso approccio funziona anche quando vuoi liberarti delle classi madri.
-
Se il trait aggiunge a un’entità un comportamento identico a quello di un’altra entità, spesso conviene introdurre un value object in PHP e usare quello.
Conclusione
Per me i trait sono una soluzione comoda: più che altro un modo di organizzare il codice invece di duplicare righe o di incastrare un’eredità dentro l’altra.


