Menu
Coddy logo textTech

Introdução a Traits

Parte da seção Programação Orientada a Objetos do Journey de PHP da Coddy. Lição 51 de 91.

PHP oferece suporte apenas à herança simples — uma classe pode estender apenas uma classe-pai. Mas e se você precisar compartilhar funcionalidades entre várias classes não relacionadas? É aí que entram os traits.

Um trait é um mecanismo de reutilização de código que permite definir métodos e propriedades que podem ser inseridos em várias classes. Pense em traits como copiar e colar no nível da linguagem — o código de um trait se torna parte da classe que o utiliza.

<?php
trait Timestampable {
    private string $createdAt;
    
    public function setCreatedAt(): void {
        $this->createdAt = date('Y-m-d H:i:s');
    }
    
    public function getCreatedAt(): string {
        return $this->createdAt;
    }
}

class Article {
    use Timestampable;
    
    public function __construct(public string $title) {
        $this->setCreatedAt();
    }
}

$article = new Article("PHP Traits");
echo $article->getCreatedAt();

A palavra-chave use dentro de uma classe importa os membros do trait. Agora, Article tem acesso a setCreatedAt() e getCreatedAt() como se eles tivessem sido definidos diretamente na classe.

A mesma trait pode ser usada em classes completamente não relacionadas — uma classe Comment, uma classe User ou qualquer outra classe que precise de funcionalidade de registro de data e hora. Isso resolve a limitação da herança única ao permitir o compartilhamento horizontal de código em toda a hierarquia de classes.

challenge icon

Desafio

Fácil

Vamos criar um sistema simples de saudações que demonstra como os traits permitem compartilhar funcionalidades entre classes não relacionadas. Você criará um trait que fornece uma capacidade de saudação e, em seguida, o usará em duas classes completamente diferentes.

Você organizará seu código em três arquivos:

  • Greetable.php: Crie um trait chamado Greetable que forneça funcionalidades de saudação. O trait deve ter:
    • Uma propriedade privada $greeting (string)
    • Um método setGreeting(string $greeting) que armazene a mensagem de saudação
    • Um método greet() que retorne a mensagem de saudação
  • Person.php: Crie uma classe Person que use o trait Greetable. Inclua o arquivo do trait e use a promoção de construtor para definir uma propriedade pública $name. No construtor, chame setGreeting() para definir a saudação como "Hello, I'm [name]".
  • Robot.php: Crie uma classe Robot que também use o trait Greetable. Inclua o arquivo do trait e use a promoção de construtor para definir uma propriedade pública $model. No construtor, chame setGreeting() para definir a saudação como "Beep boop, I am model [model]".

Em main.php, inclua os dois arquivos de classe. Você receberá duas entradas: o nome de uma pessoa e o número do modelo de um robô. Crie instâncias das duas classes e imprima suas saudações em linhas separadas.

Isso demonstra o poder dos traits: Person e Robot são classes completamente não relacionadas, sem uma classe pai compartilhada, mas ambas obtêm a mesma funcionalidade de saudação por meio do trait. Cada classe personaliza a forma como usa essa funcionalidade à sua própria maneira.

Experimente você mesmo

<?php

require_once 'Person.php';
require_once 'Robot.php';

// Ler entrada
$name = trim(fgets(STDIN));
$model = trim(fgets(STDIN));

// TODO: Crie uma instância de Person com o nome fornecido
// TODO: Crie uma instância de Robot com o modelo fornecido
// TODO: Imprima a saudação da Person
// TODO: Imprima a saudação do Robot (em uma nova linha)

?>
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de PHP online