PHP: Traits

No último artigo da nossa serie de PHP, falamos de Classes e Métodos finais. Neste artigo, vou dar a conhecer um pouco sobre Traits, o que são e alguns exemplos de como podemos usar.

Introdução

A partir da versão 5.4 do PHP, foi possível de uma forma simples e objectiva, re-usar código, pois usando a palavra reservada Trait nos nossos métodos, mais tarde podemos utilizar este mesmo método apenas recorrendo a um USE, como no exemplo abaixo.

<?php
class Conta {
    
    public $saldo = 0;
    
    public function getSaldo() 
    {
        echo "Saldo Actual: {$this->saldo}"; 
    }
    
}

trait Accoes {
    
    public function getSaldo()
    {
        echo "Saldo Disponivel: {$this->saldo}";
    }

    public function depositar($valor)
    {
        $this->saldo += $valor;
    }    

    public function levantar($valor)
    {
        if ($this->saldo >= $valor) {
            $this->saldo -= $valor;           
        }
    } 
}

class ContaCorrente extends Conta {
    use Acoes;
}

$conta = new ContaCorrente();
$conta->depositar(500);
$conta->levantar(200);
$conta->getSaldo();

// Saldo Disponivel: 300
?>

O método getSaldo(), foi reescrito dentro da nossa Trait, ou seja, sobrescreverá os métodos da classe pai.

Vejamos o exemplo abaixo:

<?php
class Conta {
    
    public $saldo = 0;
    
    public function getSaldo()
    {
        echo "Saldo Actual: {$this->saldo}";
    }
} 

trait Accoes {
    
    public function depositar($valor)
    {
        $this->saldo += $valor;
    }
    
    public function levantar($valor)
    {
        if($this->saldo >= $valor){
            $this->saldo -= $valor;
        }
    }
}

trait consultarExtracto {
    
    public function getSaldo()
    {
        echo "Saldo Disponivel para levantamento:{$this->saldo}<br>";
    }
    
    public function gerarExtracto($periodo)
    {
        echo "A gerar extracto no período de $periodo, por favor aguarde...";
    }
} 

class ContaCorrente extends Conta {
    use Accoes, consultarExtracto;
} 

$conta = new ContaCorrente();
$conta->depositar(500);
$conta->levantar(200);
$conta->getSaldo();
$conta->gerarExtracto('20/01/2013');

?>

Neste exemplo, temos duas Traits como nomes diferentes, que sobrescrevem o método getSaldo() novamente na outra Trait consultaExtracto.

Conclusão

As Traits são pura e simplesmente para re-uso de código. Isto é uma forte ajuda, para quando temos situações em que temos de andar a copiar o mesmo código, em muitas partes do projecto.

Na prática, as Traits são úteis para partilhar funcionalidades entre classes, que não são relacionadas. Segundo alguns autores, as Traits não possuem qualquer relação com heranças, sendo consideradas por alguns, como sendo “heranças horizontais”, pois estas não se tornam parte da hierarquia da classe.

O Laravel por exemplo, faz bastante uso de Traits, especialmente nos testes unitários, os quais faremos um artigos no futuro.

Para futuras referências, todos os código deste artigos, e futuros artigos, estarão disponíveis na minha conta de Github. Podem usar todo o código de forma totalmente gratuita, e para os fins que entenderem.

Mais desta série:

Continua a acompanhar a nossa série sobre PHP, com o artigo PHP: Programação Orientada a Objectos