Traits em PHP: Uma Abordagem Elegante para Compartilhar Código entre Classes

Além da Herança: Como as Traits Revolucionam a Composição de Classes no PHP

 Escrevendo testes automatizados com PHPUnit

Trait é um poderoso recurso no PHP que nos permite criar “classes” utilitárias e dispensar assim a necessidade de herança múltipla. Em outras palavras, podemos criar uma Trait que se assemelha muito a classes, mas elas não podem ser instâncias ou herdadas, pelo contrário, podem ser chamadas diretamente nas nossas classes.

Ao utilizar Traits, nosso objetivo é agrupar métodos e funções relacionados a uma entidade específica, criando uma espécie de "classe utilitária" que pode ser compartilhada entre várias classes. Essa abordagem resulta em um código mais organizado e legível, com funcionalidades bem encapsuladas e de fácil acesso. A criação de uma trait é tão simples quanto definir uma classe, mas utilizando a palavra reservada "trait" em vez de "class", permitindo-nos encapsular e compartilhar funcionalidades com uma simplicidade notável. Ao adotar traits em nosso código, expandimos consideravelmente a capacidade de reutilização de código, tornando nossas classes mais flexíveis, modulares, eficientes e garantindo que as manutenções futuras sejam mais eficazes.

Criando uma Trait

Uma trait não deve ser tratada como uma classe, mesmo que ambas sejam muito semelhantes. Conforme já vimos anteriormente, utilizamos a palavra trait ao invés de class, conforme mostra o código a seguir.

<?php

namespace App\Trait;

trait Log
{
    public function message(string $message): string
    {
        return sprintf('<b>Message</b>: %s', $message);
    }
}

Utilizando uma Trait

A utilização é bem simples, basta fazer o uso da trait dentro da classe através da sintaxe use TraitName, por exemplo. No nosso exemplo, nós utilizamos o composer para fazer o autoload das nossas dependências através da PS4, por tanto, antes da declaração de classe você verá uma chamada para o nosso arquivo.

Vamos utilizar uma classe chamada User() para chamar o método message() da nossa Trait. Veja como é simples através do exemplo abaixo.

<?php

namespace App\Controller;

use App\Trait\Log;

class User
{
    use Log;

    private string $name;

    public function __construct(string $name)
    {
        //Construtor

        $this->name = $name;
    }

    public function setUser()
    {
        //Persiste usuario

        if (true) {
            return $this->message($this->name);
        }
    }
}

Agora para finalizar, basta fazer a instância da classe usuário e chamar o método setUser(), assim a Trait será chamada e o resultado impresso na tela, se necessário.

<?php
require_once('vendor/autoload.php');

use App\Controller\User;

$user = new User('SatellaSoft.');

echo $user->setUser();

Caso tenha ficado com alguma dúvida, assista a nossa videoaula complementar, disponível abaixo.