Back-End

14 jan, 2016

Como fazer uma melhor reutilização de código PHP usando Traits – Parte 01

100 visualizações
Publicidade

Este artigo assume que você tem um conhecimento básico de Object Model usado em PHP, incluindo herança, visibilidade, propriedades, métodos e abstração de classes. Você pode revisar esses conceitos nos artigos Estendendo Classes PHP e o Object Model e Abstração de Classes em PHP.

O que é um Trait?

Traits são pedaços individuais de código que definem métodos que podem ser utilizados por diferentes classes para proporcionar uma funcionalidade adicional. Esse é um recurso introduzido no PHP 5.4.

Traits são muito parecidos com classes abstratas, com algumas diferenças que lhes permitem ser utilizados por várias classes independentes ao mesmo tempo. Quando penso em Traits, eu imagino um conjunto de ferramentas como chaves de fenda (screwDrivers). Se uma classe quer usá-las, basta pedir.

trait screwDrivers {
    
    public $type;
    
    public function slottedDriver() {
        
        $this->type = 'slotted';
        
    }
    
    public function phillipsDriver() {
        
        $this->type = 'phillips';
        
    }
    
    public function starDriver() {
        
        $this->type = 'star';
        
    }
    
}

class myTools {
    
    use screwDrivers;
    
}

No exemplo acima, a classe myTools está usando o trait screwDrivers. myTools, que pode representar minha caixa de ferramentas pessoal, tem agora um conjunto de screwDrivers (chaves de fenda) implementado pelo trait. Para os fins deste artigo, a implementação é bastante básica, pois cada método simplesmente definirá a propriedade $type.

Traits não podem ser instanciados, você não pode criar um objeto usando somente o trait. A classe deve usar traits para acessar os seus métodos. O código a seguir instancia a classe, utiliza um dos métodos traits e mostra o resultado na propriedade $type, que vai ser encaixada nesse caso.

$tools = new myTools();
$tools->slottedDriver();
echo $tools->type;

Usando múltiplos Traits

Eu quero mais do que apenas screwDrivers (chaves de fenda) em minha caixa de ferramentas, por isso vou adicionar um conjunto de wrenches (chaves de boca) também.

trait screwDrivers {
    
    public $driverType;
    
    public function slottedDriver() {
        
        $this->driverType = 'slotted';
        
    }
    
    public function phillipsDriver() {
        
        $this->driverType = 'phillips';
        
    }
    
    public function starDriver() {
        
        $this->driverType = 'star';
        
    }
    
}

trait wrenches {
    
    public $wrenchType;
    
    public function openWrench() {
        
        $this->wrenchType = 'open';
        
    }
    
    public function boxWrench() {
        
        $this->wrenchType = 'box';
        
    }
    
    public function allenWrench() {
        
        $this->wrenchType = 'allen';
        
    }
    
}

class myTools {
    
    use screwDrivers, wrenches;
    
}

myTools agora está usando screwDirvers e wrenches. Observe que a propriedade $type foi alterada para $driverType e $wrenchType nos traits.

Se uma classe definir uma propriedade ou incluir traits que definam propriedades do mesmo nome, um aviso E_STRICT é emitido. Se essas propriedades duplicadas não têm os mesmos valores ou tipos, então o script falhará com um erro fatal.

Para evitar isso, tenha certeza de que os nomes de propriedades são únicos. Uma abordagem mais avançada é a utilização de accessor methods, o que está além do escopo deste artigo.

Conclusão

Traits são uma grande novidade introduzida no PHP 5.4. Esta parte do artigo apresentou os conceitos básicos sobre como usar uma ou mais traits em uma classe.

A próxima parte aborda tópicos mais avançados sobre traits, como a resolução de conflitos pelo uso de traits que definem as mesmas propriedades, alterar a visibilidade de um método trait na classe que o utiliza, e reutilização de traits dentro de traits.

Se você gostou deste artigo, ou você tem alguma dúvida sobre traits, deixe um comentário aqui.

***

Dave Smith faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link:  http://www.phpclasses.org/blog/post/305-How-to-Make-Better-Reuse-of-PHP-Code-using-Traits-Part-1-Basic-Code-Reuse.html