Come definire e utilizzare i trait in PHP

I trait consentono di mitigare il problema dell'ereditarietà multipla, funzionalità non supportata dal linguaggio PHP.

Pubblicato da ,
Ultima modifica

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.