Il linguaggio PHP non supporta l'ereditarietà multipla delle classi, per questo è possibile usare i trait, la sintassi per definire un trait è la seguente
codice PHP
<?php
trait <nome trait>{
//code
}
per utilizzare un trait in una classe si usa l'operatore use.
Ad esempio
codice PHP
<?php
trait T
{
public function foo()
{
//code function foo
}
}
class A
{
use T;
}
$a = new A();
$a->foo();
la classe A utilizza il trait T mediate l'operatore use e eredita il metodo foo, in particolare è possibile utilizzare più trait, ad esempio con la sintassi
codice PHP
<?php
class A
{
use T1,T2;
}
la classe A utilizza sia il trait T1 che il trait T2.
Nel caso in cui ci siano più trait con variabili e funzioni con lo stesso nome, è possibile usare la keyword insteadof per ovviare a questo problema, ad esempio
codice PHP
<?php
trait E
{
public function foo()
{
echo "Trait E";
}
}
trait F
{
public function foo()
{
echo "Trait F";
}
}
class A
{
use E, F
{
F::foo insteadof E;
}
}
$a = new A();
$a->foo(); // return 'Trait F'
la classe A utilizza i trait E ed F, e tramite la keyword insteadof utilizza il metodo foo di F e non di E.
Un'altra caratteristica importante dei trait, è quella di poter manipolare i metodi e le variabili, ad esempio
codice PHP
<?php
trait E
{
public function foo()
{
}
}
class A
{
use E
{
foo as protected;
}
}
class B
{
use E
{
foo as private myfoo;
}
}
la classe A utilizza il trait E è cambia il metodo foo da public a protected, mentre la classe B utilizza il trait E e cambia il metodo foo da public a private e inoltre gli assegna un nuovo nome myfoo.