sábado, 5 de outubro de 2013

PHP 5.4 (Traits)

Olá pessoal, vamos falar hoje um pouco do PHP 5.4.

Documentação oficial: php 

A característica é semelhante a uma classe, mas apenas a intenção de funcionalidade grupo de uma forma refinada e consistente. Não é possível, para instanciar um traço por si próprio. É uma adição à herança tradicional e permite composição horizontal de comportamento, ou seja, a aplicação dos membros da classe sem exigir herança.

Traits são mecanismos que ajudam (e muito) a reutilização de código, e servem perfeitamente para resolver o problema da falta de herança simples e múltipla. Assim  permite que o desenvolvedor possa reutilizar seus códigos e conjuntos de métodos livremente. As caracteristicas é semelhante a uma classe, é muito fácil!

Suponhamos que você tenha duas ou mais classes que precisam usar um MÉTODO/COMPORTAMENTO em comum, antes da versão 5.4 você faria algo do tipo: 

Primeiro temos nossa classe Log, que serviria pra salvar mensagens de log (imagine uma classe completa, que faça algo de útil):

 class Log {
    public function log($message) {
        // Salva $message em um log de alguma forma
     }
 }

Veja: agora você tem outras classes que fazem uso dessa funcionalidade (salvar logs), mas essas classes não podem (e nem deveriam) estender Log, então você faria algo do tipo:

class Usuario extends Model {

    protected $Log;

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

    public function save() {
        // Salva o usuário de alguma forma
        // ...

        // Salva uma mensagem de log
        $this->Log->log('Usuário criado');
    }

}

class Carrinho extends Produto {

    protected $Log;

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

    public function clear() {
        // Limpa o carrinho de alguma forma
        // ...

        // Salva uma mensagem de log
        $this->Log->log('Carrinho de compras limpo');
    }

}

Mais uma vez, o conteúdo ou métodos dessas classes não importa.. o que importa aqui é o trabalho que temos para poder usar o Log::log() para salvar mensagens de log.

Já na versão 5.4, podemos transformar a classe Log numa Trait:

trait Log {

    public function log($message) {
        // Salva $message em um log de alguma forma
    }

}

E manter o comportamento das nossas classes, de forma bem mais simples:

class Usuario extends Model {

    use Log;

    public function save() {
        // Salva o usuário de alguma forma
        // ...

        // Salva uma mensagem de log
        $this->log('Usuário criado');
    }

}

Outra classe veja:

class Carrinho extends Produto {

    use Log;

    public function clear() {
        // Limpa o carrinho de alguma forma
        // ...

        // Salva uma mensagem de log
        $this->log('Carrinho de compras limpo');
    }

}

Podemos usar o método log() diretamente (sem a necessidade de instanciar um objeto de Log) pois nossas classes adquiriram as características (métodos e atributos) de Log! 

Conclusão:

Traits são de fato recursos bem interessantes e muitos frameworks estão se adaptando à esse poderoso recurso. Então aproveite também.

Espero que você tenha gostado e faça um bom uso desse novo recurso! 

Abraço, e voltem sempre!

Nenhum comentário:

Postar um comentário