Traits no PHP

João Roberto da Paixão
Desenvolvendo com Paixão
3 min readMay 1, 2018

Traits são pedaços de código que definem propriedades e métodos que podem ser utilizados por diferentes classes, fornecendo funcionalidades adicionais. São semelhantes às classes abstratas, visando a reutilização de código e resolvendo o problema da falta de herança múltipla. Esse é um recurso introduzido no PHP 5.4.

Vale reforçar que trait não é igual a uma classe, uma trait não pode ser instanciada em forma de objeto. A principal diferença esta na possibilidade de agrupamento. Em uma herança de classe (extends) a herança das características e comportamentos sempre se dá de forma vertical. ( O PHP só permite que uma classe herde diretamente de uma única classe ). Utilizando traits é possível associar várias traits a uma única classe, daí que surge o termo herança horizontal.

Sintaxe das Traits

A sintaxe para implementar uma trait é bem semelhante à da criação de uma classe. Basta usar a palavra-reservada “trait” e encapsular os atributos e métodos que definem a trait.

/** Trait exemplo */
trait Exemplo
{
public function exemplo($arg)
{
// ....
}
}

Quando devo usar Traits?

Traits devem ser utilizadas de acordo com o contexto. O uso é indicado quando duas ou mais classes PHP precisam implementar um comportamento semelhante, mas ambas as classes não possuem nenhuma relação hierárquica.
Em uma aplicação hipotética, vamos criar uma classe para abstrair chamadas cURL:

/** Curl Class*/
Classe Curl
{
public function curl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);

return $output;
}
}

Vamos supor que nessa aplicação, existem duas classes que fazem requisições para as APIs do Facebook e Twitter via cURL, mas essas classes não podem estender Curl (Totalmente fora do contexto hierárquico), então você faria algo semelhante à isso:

/** Twitter API Class */
class Twitter_API
{
protected curl;

public function __construct(){
$this->curl = new Curl();
}
public function get($url)
{
$response = $this->curl('http://api.twitter.com/'.$url);
return json_decode($response);
}
}

/** Facebook API Class */
class Facebook_API
{
protected curl;

public function __construct(){
$this->curl = new Curl();
}

public function get($url)
{
$response = $this->curl('http://graph.facebook.com/'.$url);
return json_decode($response);
}
}

Aderindo o uso de Traits, nosso código ficara assim:

/** cURL wrapper trait */
trait cURL
{
public function curl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
}

Agora as classes Facebook e Twitter podem usar o método curl() diretamente, pois ambas as classes adquiriram essa característica através do uso da Trait.

// Omitindo namespace e import da trait...

/** Twitter API Class */
class Twitter_API
{
use cURL;
public function get($url)
{
$response = $this->curl('http://api.twitter.com/'.$url);
return json_decode($response);
}
}
/** Facebook API Class */
class Facebook_API
{
use cURL;

public function get($url)
{
$response = $this->curl('http://graph.facebook.com/'.$url);
return json_decode($response);
}
}

Espero ter ajudado, abraço!

P.S: Artigo original publicado em: https://blog.especializati.com.br/traits-no-php/

--

--

João Roberto da Paixão
Desenvolvendo com Paixão

Eterno aprendiz que compartilha aquilo que aprende. Apaixonado por tecnologia, desenvolvimento pessoal e investimentos. Pai de família, um cara tranquilo =) !