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.
Desafio
FácilVamos 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 chamadoGreetableque 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
- Uma propriedade privada
Person.php: Crie uma classePersonque use o traitGreetable. Inclua o arquivo do trait e use a promoção de construtor para definir uma propriedade pública$name. No construtor, chamesetGreeting()para definir a saudação como"Hello, I'm [name]".Robot.php: Crie uma classeRobotque também use o traitGreetable. Inclua o arquivo do trait e use a promoção de construtor para definir uma propriedade pública$model. No construtor, chamesetGreeting()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)
?>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
1Fundamentos de OOP
Arquivos externosIntrodução à OOPClasses vs. objetosA palavra-chave $thisMétodosPropriedadesConstrutor (__construct)Destrutor (__destruct)Recapitulação - Calculadora simples4Herança
Herança BásicaA Palavra-chave parent::Sobrescrita de MétodosA Palavra-chave finalClasses AbstratasRecapitulação - Hierarquia de Funcionários7Encapsulamento
Público, Protegido, PrivadoModificadores de Acesso em ProfundidadeGetters e SettersOcultação de InformaçõesPromoção de Construtor (8.0)Recapitulação - Sistema de Registros de Alunos10Conceitos Avançados de OOP
Composição vs. HerançaInjeção de DependênciaClasses AnônimasEnums (PHP 8.1)Fibras (PHP 8.1)Análise Profunda da Clonagem de ObjetosGeradores e Iteradores13Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository2Namespaces e Autoloading
Introdução a NamespacesA palavra-chave usePadrão de Autoloading PSR-4Autoloader do ComposerRecapitulação - Projeto organizado5Interfaces e Contratos
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesInterface vs Classe AbstrataTipagem com InterfacesRecapitulação - Calculadora de Formas8Métodos Mágicos
Introdução aos Métodos Mágicos__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e Clonagem de Objetos__serialize e __unserializeRecapitulação - Coleção Personalizada11Sistema de Tipos e Tratamento de Erros
Declarações de TiposTipos NulosTipos de União e InterseçãoClasses de ExceçãoHierarquia de Exceções PersonalizadaTry, Catch, FinallyRecapitulação - Validador de Formulário14Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários3Propriedades de Classes
Propriedades de Instância vs. EstáticasConstantes em ClassesMétodos e Propriedades EstáticosPropriedades Privadas e ProtegidasPropriedades Somente para Leitura (PHP 8.1)Recapitulação - Gerenciador de Contas Bancárias6Polimorfismo
Revisão da Sobrescrita de MétodosPolimorfismo via InterfacesIndicação de Tipos e Tipos UnionVinculação Estática TardiaRecapitulação - Processador de Pagamentos9Traits
Introdução a TraitsUsando Múltiplos TraitsResolução de Conflitos entre TraitsMétodos Abstratos em TraitsTraits vs. Herança12Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão StrategyPratique por conta própria: Compilador de PHP online