Come abbiamo ripetuto diverse volte nelle nostre guide per imparare php, nella programmazione informatica moderna, un grande focus è posto sull’evitare il più possibile la duplicazione del codice. Sappiamo bene, ormai, che un codice duplicato rende la manutenzione del software molto più difficile, in quanto ogni duplicato deve essere mantenuto costante, e che un bug non può essere trovato/risolto in un unico punto.
Nell’ambito della programmazione ad oggetti, alcuni limiti strutturali di PHP possono rendere abbastanza complicato mantenere al minimo la duplicazione di codice. Abbiamo anche detto, nei precedenti capitoli, che PHP non supporta l’ereditarietà multipla, e questo potrebbe, ovviamente, portare all’impossibilità di riutilizzare determinati metodi su classi che invece vorrebbero poterli utilizzare senza legarsi con l’ereditarietà.
E’ proprio per questo che, a partire dalla versione 5.4, PHP implementa un metodo di riutilizzo del codice chiamato Traits.
Traits PHP: cosa sono, come si dichiarano, come si usano
I traits nascono con l’obiettivo di ridurre alcune limitazioni dettate dall’ereditarietà singola propria di PHP, consentendo allo sviluppatore web di poter riutilizzare una serie di metodi senza che questi debbano essere ereditati da qualche altra classe.
Prendiamo ad esempio una classe Person e una classe Dog.
class Person{} class Dog{}
Sappiamo bene che né persone né cani possono volare, ma, magari, potrebbero volerlo fare. È qui che entrano in gioco i traits: potremmo pensare che, dotando di un jetpack una persona e un cane, essi possano effettivamente poter volare.
trait Jetpack { public function volo(){ echo "*Vola alto nel cielo*\n"; } }
Quello che dobbiamo fare, adesso, è specificare alla classe Persone e alla classe Dog che possono effettivamente usare un jetpack.
class Person{ use Jetpack; } class Dog{ use Jetpack; }
Tramite la keyword use, noi stiamo dicendo alle due classi che hanno accesso a tutte le proprietà e metodi del trait Jetpack, potendole quindi utilizzare.
$persona = new Person(); $cane = new Dog(); $persona->volo(); $cane->volo(); //Output: *Vola in alto nel cielo* *Vola in alto nel cielo*
In questo modo, due classi completamente a sé stanti, non legate in nessun modo, hanno accesso al medesimo metodo volo().
Inoltre, una classe può utilizzare multipli traits, senza alcun tipo di problema, andando a espandere ancor di più le nostre possibilità.
Possiamo pensare ai traits come una pennellata che aggiunge dei tratti caratteristici ad una serie di classi che non sono legate da un rapporto di ereditarietà.
L’unica cosa da ricordare è che non possiamo chiamare i traits con lo stesso nome utilizzato per una classe, pena un fatal error.
In conclusione, i traits rappresentano uno strumento importantissimo che contribuisce a migliorare la progettazione delle nostre applicazioni, rimuovendo la necessità di duplicare il codice e aiutandoci con la pulizia e la manutenibilità dello stesso.