domingo, 7 de julho de 2024

Traits em PHP: Reutilização de Código Simplificada

Se você já se deparou com a necessidade de utilizar o mesmo método em várias classes diferentes, e a herança não se mostra como uma boa opção, então os Traits são a solução.

Na programação orientada a objetos, devemos estender classes que compartilham métodos e propriedades em um mesmo contexto. Seguindo esse conceito de herança, é possível ter uma classe "Animal" que é estendida por "Cachorro" e "Gato". Contudo, há situações onde precisamos compartilhar comportamentos entre classes de contextos distintos. Imagine um cenário onde temos uma classe que gerencia os logs da aplicação e possui métodos que precisam ser usados em diversas outras classes do sistema. De fato, não faria sentido definir a classe de log como pai de "Cachorro" ou "Gato", pois esses não são tipos de log, mas sim que utilizam log.

Para resolvermos esse problema, podemos utilizar os Traits, na quais permitem definir métodos e propriedades para complementar nossas classes sem a necessidade de estendê-las. Por isso, alguns autores denominam os Traits como "herança horizontal", em contraste com a herança vertical, onde há alteração no nível da hierarquia.

Vamos ver isso na prática com exemplos de código. 

Implementando Traits em PHP

Para o projeto de hoje, precisamos do PHP e Composer instalados.

Vamos começar criando o arquivo composer.json e definindo a estrutura do nosso projeto:


{
    "name": "wdev/traits",
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

Agora, instale as dependências com o comando:


composer install

Crie a estrutura do projeto, incluindo o arquivo index.php na raiz do projeto:


<?php
require 'vendor/autoload.php';

// Exemplo inicial de utilização dos Traits

Exemplo de Uso de Traits

Vamos criar duas classes que compartilham métodos comuns utilizando Traits.

  1. Crie a classe Cachorro:


<?php
namespace App\Animal;

class Cachorro {
    use \App\Traits\Nome;
}

  1. Crie a classe Cliente::


namespace App\Pessoa;

class Cliente {
    use \App\Traits\Nome;
}

  1. Defina o Trait Nome::


namespace App\Traits;

trait Nome {
    private $nome;

    public function setNome($nome) {
        $this->nome = $nome;
    }

    public function getNome() {
        return $this->nome;
    }
}

  1. Atualize o index.php para usar essas classes:


<?php
require 'vendor/autoload.php';

use App\Animal\Cachorro;
use App\Pessoa\Cliente;

$cachorro = new Cachorro();
$cachorro->setNome("Rex");

$cliente = new Cliente();
$cliente->setNome("João");

echo "Nome do cachorro: " . $cachorro->getNome() . PHP_EOL;
echo "Nome do cliente: " . $cliente->getNome() . PHP_EOL;

Adicionando mais Funcionalidades com Traits

Agora, vamos criar um Trait adicional para logar informações.

  1. Defina o Trait Log:


namespace App\Traits;

trait Log {
    public function gravarLog() {
        echo "Log: " . date('Y-m-d H:i:s') . " - Classe: " . get_class($this) . PHP_EOL;
        print_r(get_object_vars($this));
        echo str_repeat("-", 20) . PHP_EOL;
    }
}

  1. Utilize o Trait Log nas classes Cachorro e Cliente:


namespace App\Animal;

class Cachorro {
    use \App\Traits\Nome, \App\Traits\Log;
}

namespace App\Pessoa;

class Cliente {
    use \App\Traits\Nome, \App\Traits\Log;
}

  1. Atualize o index.php para usar o método gravarLog:

  
<?php
require 'vendor/autoload.php';

use App\Animal\Cachorro;
use App\Pessoa\Cliente;

$cachorro = new Cachorro();
$cachorro->setNome("Rex");
$cachorro->gravarLog();

$cliente = new Cliente();
$cliente->setNome("João");
$cliente->gravarLog();

Conclusão

Neste projeto, aprendemos a definir e utilizar Traits em PHP para compartilhar comportamentos entre classes, sem a necessidade de herança direta ou duplicação de código. Como resultado, temos um código mais limpo e de fácil manutenção.

Nenhum comentário:

Postar um comentário