O que são Traits no PHP e quando usar? \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 03 Horas 

 01 Min 

 30 Seg 

   Tempo restante da oferta: 03 01 30 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) O que são Traits no PHP e quando usar?  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

# O que são Traits no PHP e quando usar?

 Uma reflexão sobre reuso de código, herança e a recomendação de utilização de Traits.

 [ Kennedy Tedesco ](https://www.treinaweb.com.br/blog/autor/kennedy-tedesco) 8 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/04/01155343/traits-php.jpg)  

Antes de iniciarmos o tema central do artigo, vamos dar uma passadinha no assunto de herança, pois é comum vermos a associação de uma coisa com a outra.

Na herança as implementações e as especificações descem na “árvore”:

![Diagrama sobre herança](https://dkrn4sk0rn31v.cloudfront.net/2018/07/17114805/Screen-Shot-2017-05-02-at-19.32.00.png)

Representando isso em código, temos:

```php
class Animal
{
   // TODO
}

class Gato extends Animal
{
   // TODO
}

class Coelho extends Animal
{
   // TODO
}

class Cachorro extends Animal
{
   // TODO
}

```

Herança é normalmente utilizada para se atingir o reuso de código. Mas, em essência, ela não é sobre reuso. É sobre definir uma hierarquia estrita de tipo. Reuso é a consequência de se usar herança. Quando se pensa em herança apenas com o objetivo de reuso, tendemos a cometer algumas distorções conceituais.

Antes de continuar a leitura desse artigo, recomendo fortemente a leitura de outro artigo aqui do blog: “[Devo usar herança ou composição?](https://www.treinaweb.com.br/blog/devo-usar-heranca-ou-composicao/)”. Ele explica em detalhes o que é herança e quando faz sentido utilizá-la.

## Traits

Traits, por outro lado, são pura e simplesmente para reuso de código, que pode nos auxiliar nos casos em que fatalmente precisamos cair no comportamento de “copiar e colar” determinados trechos de códigos em diferentes classes.

Alguns autores denominam que Traits são um mecanismo de “herança horizontal”, que seria o contrário da “herança vertical” (a herança clássica, que envolve hierarquia e tipo, comentado anteriormente). Mas, na realidade, se levarmos para um entendimento mais estrito, Traits não possuem nenhuma relação com herança, ademais, elas não se tornam parte e tipo da hierarquia da classe. Entender Traits como “herança horizontal” facilita o entendimento (não é pecado), mas não é conceitualmente fiel.

Então, na prática, Traits podem ser úteis para que compartilhemos determinadas funcionalidades (códigos) entre classes que não são relacionadas (de hierarquias/tipos diferentes).

[  ![PHP Avançado](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/php.svg)   Curso PHP Avançado Conhecer o curso ](https://www.treinaweb.com.br/curso/php-avancado)

Supondo que estamos trabalhando com duas classes que precisam de um método `slug()` para a montagem de URL a partir de um atributo `nome`:

```php
class Curso
{
    public function slug(): string
    {
        return strtolower(
            preg_replace('/[^A-Za-z0-9-]+/', '-', $this->nome)
        );
    }
}

class Formacao
{
    public function slug(): string
    {
        return strtolower(
            preg_replace('/[^A-Za-z0-9-]+/', '-', $this->nome)
        );
    }
}

```

A gente já consegue identificar logo de cara o problema da duplicação de código. O método `slug()` é o mesmo nas duas classes.

A primeira solução imaginada quando se dá muita importância para o reuso de código oferecido pela herança, seria criar uma classe base, por exemplo:

```php
class BaseClassWithSlug
{
    public function slug(): string
    {
        return strtolower(
            preg_replace('/[^A-Za-z0-9-]+/', '-', $this->nome)
        );
    }
}

class Curso extends BaseClassWithSlug
{
    //
}

class Formacao extends BaseClassWithSlug
{
    //
}

```

Você já deve ter notado que isso não é uma boa ideia. Resolvemos o problema da duplicação, mas criamos outro: herança só faz sentido quando se tem a necessidade de **representar um tipo**. Se a nossa classe não é do **tipo** da outra, herança não deve ser utilizada. Quando estendemos uma classe, não herdamos apenas a sua implementação e sua especificação, herdamos também o seu **tipo**. Uma classe herdada passa a ser do tipo da outra e, a partir dela, novos sub-tipos podem ser compostos.

Essa é uma opção que a grosso modo funciona, mas que nos leva a muitas inconsistências, mais que isso, pode nos levar a um ciclo vicioso de sempre criar uma classe base para ser estendida no intuito de evitar duplicação de código. Como já foi comentado no [artigo indicado](https://www.treinaweb.com.br/blog/devo-usar-heranca-ou-composicao/), **composição** também tem um grande mecanismo de reuso e deve ser considerado preferencialmente em detrimento à herança (para grande parte dos casos).

O que precisamos nesse caso é uma forma de extrair essa funcionalidade e importar nas classes que precisam dela. É aí que entra um possível caso de uso de **Trait**:

```php
trait SlugNome
{
    public function slug(): string
    {
        return strtolower(
            preg_replace('/[^A-Za-z0-9-]+/', '-', $this->nome)
        );
    }
}

class Curso
{
    use SlugNome;
}

class Formacao
{
    use SlugNome;
}

```

Resolvemos de uma forma um pouco mais elegante, sem precisar definir um tipo genérico e fazê-lo ser herdado. Uma Trait é importada para uma classe usando a sintaxe `use`. Mais de uma Trait pode ser importada a partir da mesma declaração `use` separando os nomes por vírgulas ou através de mais de uma declaração `use`. Instanciando tais objetos você conseguirá acessar o método `slug()`.

As opções abaixo de importação são equivalentes:

```php
class TestClass
{
    use TraitOne, TraitTwo;
}

// Ou

class TestClass
{
    use TraitOne;
    use TraitTwo;
}

```

Mas nem tudo são flores. Quando uma classe passa a usar uma Trait, você precisa garantir que tudo o que for importado vai funcionar corretamente. Por exemplo, a nossa Trait precisa de um atributo `nome` para funcionar. Uma possível solução para evitar bugs ao utilizá-la em outras classes é validar se o atributo `nome` existe, caso contrário, lançar uma exceção:

```php
trait SlugNome
{
    public function slug(): string
    {
        if ( ! property_exists($this, 'nome')) { 
            throw new RuntimeException('Faltando o atributo nome para o retorno do slug.');
        }

        return strtolower(
            preg_replace('/[^A-Za-z0-9-]+/', '-', $this->nome)
        );
    }
}

class Curso
{
    use SlugNome;
}

class Formacao
{
    use SlugNome;
}

```

Ou, claro, talvez você tenha bons testes para garantir que todas as classes que importem essa Trait funcionem corretamente.

Uma classe pode importar quantas Traits precisar e as Traits possuem acesso aos membros privados da classe, o que pode ser bom ou ruim, dependendo do ponto de vista de quanto a Trait interage com ela.

[  ![Laravel -  Service Container, Service Provider e Facades](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/laravel.svg)   Curso Laravel - Service Container, Service Provider e Facades Conhecer o curso ](https://www.treinaweb.com.br/curso/laravel-service-container-service-provider-e-facades)

## Concluindo

[Frameworks](https://www.treinaweb.com.br/blog/para-que-serve-um-framework/ "Frameworks") como [Symfony](https://www.treinaweb.com.br/blog/o-que-e-symfony/ "Symfony") e [Laravel](https://www.treinaweb.com.br/blog/o-que-e-laravel/ "Laravel"), principalmente esse último, fazem um uso bem relevante de Traits, com destaque para a parte que toca testes unitários.

O Laravel, além do caso de uso padrão, tem outro para as Traits, que é o de organizar melhor o código dos seus componentes. Por exemplo, no componente `Http` tem um namespace chamado [Concerns](https://github.com/laravel/framework/tree/5.8/src/Illuminate/Http/Concerns "Concerns") onde o framework extraiu para Traits comportamentos que estavam todos embutidos na classe `Request`, pois estavam tornando-a muito grande e de difícil manutenção. Esse tipo de uso (com o único intuito de organizar melhor o código) deve ser a exceção e não a regra em nossos projetos, senão caímos na “armadilha” de ver as Traits como solução para outro problema: classes “gordas” demais, com muitas responsabilidades que poderiam ser melhor decompostas. No final, é sempre uma questão de bom senso.

Como você deve ter percebido, o objetivo desse artigo não foi o de masterizar o uso de Traits, todas as sintaxes possíveis e tudo mais. Outros detalhes podem ser vistos na própria [documentação](https://www.php.net/manual/en/language.oop5.traits.php) oficial. O que fizemos aqui foi uma reflexão do que normalmente acontece no desenvolvimento e sobre como Traits podem nos ajudar em alguns casos. Lembrando que nada é solução completa e perfeita para tudo. A comunicação entre objetos, composição, padrões, herança etc, é a integração de todas essas coisas no momento “adequado” que faz a “mágica” de uma aplicação orientada a objetos acontecer.

Até a próxima!

[  ![Desenvolvedor PHP Sênior](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/php.svg)   Formação Desenvolvedor PHP Sênior Conhecer a formação ](https://www.treinaweb.com.br/formacao/desenvolvedor-php-senior)

Autor

 ![Kennedy Tedesco](//secure.gravatar.com/avatar/236c86e9469327ba7a9250ff15fef424?d=mm)

## Kennedy Tedesco

 Head de desenvolvimento. Vasta experiência em desenvolvimento Web com foco em PHP. Graduado em Sistemas de Informação. Pós-graduando em Arquitetura de Software Distribuído pela PUC Minas. Zend Certified Engineer (ZCE) e Coffee Addicted Person (CAP). [@KennedyTedesco](https://twitter.com/KennedyTedesco) 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/kennedy-tedesco)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/05/O-QUE-E-PHP-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     5 anos atrás

    ##  [ Guia da linguagem PHP ](https://www.treinaweb.com.br/blog/guia-da-linguagem-php) 

     Nesse guia de PHP você aprenderá o necessário para criar os seus primeiros softwares com a linguagem de programação PHP. Acesse agora mesmo!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/07/MIXINS-DART-400x280.png)  [ Flutter ](https://www.treinaweb.com.br/blog/categoria/flutter) 

     6 anos atrás

    ##  [ O que são mixins e qual sua importância no Dart ](https://www.treinaweb.com.br/blog/o-que-sao-mixins-e-qual-sua-importancia-no-dart) 

     Veja neste artigo o que são mixins e qual sua importância no Dart.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/07/DICA-CODIGO-PHP-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     3 anos atrás

    ##  [ Dica de Código: Enums no PHP ](https://www.treinaweb.com.br/blog/dica-de-codigo-enums-no-php) 

     Descubra como os enums no PHP podem transformar seu código, tornando-o mais claro e eficiente. Otimize seu código agora!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/01/20161857/PHP-PSR1-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ PSR-1 Conheça os padrões básicos de codificação do PHP ](https://www.treinaweb.com.br/blog/psr-1-conheca-os-padroes-basicos-de-codificacao-do-php) 

     Conheça as recomendações da PSR-1 sobre os padrões básicos de codificação da linguagem PHP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/relat-rio-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     10 anos atrás

    ##  [ Relatório de cobertura de testes (Code Coverage) com o PHPUnit ](https://www.treinaweb.com.br/blog/relatorio-de-cobertura-de-testes-code-coverage-com-o-phpunit) 

     O PHPUnit é um framework para a criação de testes unitários. Nesse artigo vamos falar sobre a geração de relatórios de cobertura de testes (Code Coverage).

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/camadas-e-componentes-do-padrao-arquitetural-porto-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     6 anos atrás

    ##  [ Camadas e componentes do padrão arquitetural Porto ](https://www.treinaweb.com.br/blog/camadas-e-componentes-do-padrao-arquitetural-porto) 

     Conheça as camadas e componentes do padrão arquitetural Porto. Nesse artigo vamos aprender como cada camada se comunica e a responsabilidade dos componentes.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/87asgh12-400x280.png)  [ Orientação a Objetos ](https://www.treinaweb.com.br/blog/categoria/orientacao-a-objetos) 

     10 anos atrás

    ##  [ Devo usar herança ou composição? ](https://www.treinaweb.com.br/blog/devo-usar-heranca-ou-composicao) 

     A composição permite um reuso e extensão de código mais flexível que a herança clássica. Mas isso é motivo para sempre a escolhermos em detrimento à herança clássica?

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/08/27124433/lambda-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     8 anos atrás

    ##  [ Closures e funções anônimas no PHP ](https://www.treinaweb.com.br/blog/closures-e-funcoes-anonimas-no-php) 

     Conheça mais sobre as funções anônimas, como se comportam no PHP e em qual momento se tornam closures. Além disso, entenda como funcionam os métodos bind(), call() e bindTo() da classe especial Closure.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/busca-laravel-scout-algolia-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     10 anos atrás

    ##  [ Full Text Search com Laravel, Scout e Algolia ](https://www.treinaweb.com.br/blog/full-text-search-com-laravel-scout-e-algolia) 

     Aprenda como realizar buscas textuais rápidas e eficientes independentemente da quantidade de registros, campos ou tamanhos de textos.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/03/TWELVE-FACTOR-APP-400x280.png)  [ Engenharia de Software ](https://www.treinaweb.com.br/blog/categoria/engenharia-de-software) 

     6 anos atrás

    ##  [ O que são os 12 factor app? - Parte 3 ](https://www.treinaweb.com.br/blog/o-que-sao-os-12-factor-app-parte-3) 

     Nesta terceira parte, iremos abordar mais três dos 12 princípios: port binding, concurrency e disposability.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/02/TWELVE-FACTOR-APP-400x280.png)  [ Engenharia de Software ](https://www.treinaweb.com.br/blog/categoria/engenharia-de-software) 

     6 anos atrás

    ##  [ O que são os 12 Factor App? – Parte 2 ](https://www.treinaweb.com.br/blog/o-que-sao-os-12-factor-app-parte-2) 

     No artigo anterior, foi apresentado o conceito do 12 Factor App. Nessa segunda parte, veremos mais três fatores: Backing Services; Build, Release, Run e Processes.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/01/TWELVE-FACTOR-APP-400x280.png)  [ Engenharia de Software ](https://www.treinaweb.com.br/blog/categoria/engenharia-de-software) 

     6 anos atrás

    ##  [ O que são os 12 Factor App? - Parte 1 ](https://www.treinaweb.com.br/blog/o-que-sao-os-12-factor-app-parte-1) 

     Se você trabalha desenvolvendo aplicativos que funcionam como um serviço, conheça os 12 (Twelve) Factor App, uma metodologia que te ajudará a criar aplicações melhores.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **03h 01min 30s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
