Como usar Attributes/Annotations no PHP 8 \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 15 Horas 

 34 Min 

 55 Seg 

   Tempo restante da oferta: 15 34 55 

  [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) Como usar Attributes/Annotations no PHP 8  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

# Como usar Attributes/Annotations no PHP 8

 Aprenda como utilizar attributes no PHP 8. Veja o que são, qual a sintaxe e como obter os dados das annotations na prática.

 [ Elton Fonseca ](https://www.treinaweb.com.br/blog/autor/elton-fonseca) 6 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/11/como-usar-attritutes-annotations-no-php-8.png)  

Nesse artigo vamos conhecer o que são annotations no PHP 8, como usar esse recurso e também como implementar a parte de obtenção dos valores dos attributes.

[  ![PHP - Novidades do PHP 8.0](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/php.svg)   Curso PHP - Novidades do PHP 8.0 Conhecer o curso ](https://www.treinaweb.com.br/curso/php-novidades-do-php-8-0)

## O que são Annotations

Annotations ou no caso do PHP também chamado de Attributes, é um modo que temos de declararmos meta informações a respeito de um determinado elemento de código. Podemos declarar meta informações sobre uma propriedade, um método ou uma classe. Veja um pseudo código abaixo:

```php
@entidade
class Carro
{
    @validacao(min: 1990, max: 2015)
    propriedade inteira ano;

    @acao
    funcao andar(velocidadeMaxima)
    {}
}

```

No exemplo acima temos as seguintes meta informações:

- **@entidade** - é uma anotação da classe Carro, que poderia indicar que ela é uma entidade da aplicação.
- **@validacao** - é uma anotação da propriedade, nesse exemplo está indicando que os valores válidos para essa propriedade devem ser entre 1990 e 2015.
- **@acao** - anotação do método, poderia ser utilizado para indicar que esse método realiza uma ação e notificar algum outro trecho de código.

## Annotations antes do PHP 8

Mesmo antes do PHP 8 alguns projetos já utilizavam o conceito na linguagem, porém esse processo era realizado de maneira não oficial. As annotations eram definidas dentro de blocos de comentários, com base nisso eles liam esses arquivos e obtinham as meta informações.

Se você já trabalhou com Symfony ou Doctrine provavelmente já utilizou annotations, mesmo em versões anteriores do PHP. Veja o seguinte código utilizado no Doctrine:

```php
/**
 * @ORM\Entity(repositoryClass="App\Repository\TaskRepository")
 */
class Task
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=100)
     * @Assert\Length(
     *      min = 5,
     *      minMessage = "length.min"
     * )
     * @HasString(
     *      string = "Elton"
     * )
     */
    private $title;
}

```

## Annotations no PHP 8

A partir da versão 8 do PHP as annotations ou como foi chamado na linguagem “attributes”, ganharam uma implementação nativa e padronizada. A sintaxe definida para sinalizar um atributo ficou:

```php
#[AnotacaoSemParametro]

```

E quando necessário enviar algum parâmetro:

```php
#[AnotacaoComParametro(parametro1: valor, parametro2: valor)]

```

Será possível usar attributes no PHP 8 para classes, métodos e propriedades.

No [Symfony 5.2](https://symfony.com/blog/new-in-symfony-5-2-php-8-attributes "Symfony 5.2") já será possível substituir as annotations antigas pelos attributes do php 8:

```php
class SomeController
{
    #[Route('/path', name: 'action')]
    public function someAction()
    {
        // ...
    }
}

```

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

## Como obter valores dos attributes no php 8

Se você for apenas usar bibliotecas externas para declarar meta informações sobre seu código, a sintaxe que aprendemos até agora já é suficiente. Agora se quiser criar suas próprias anotações personalizadas, precisará usar um pouco da [API de reflection do PHP](https://www.treinaweb.com.br/blog/api-de-reflexao-do-php/ "API de reflection do PHP").

Vamos supor que deseja validar os dados das propriedades de uma classe usando anotações:

```php
class Carro {
    #[Validacao('max', 110)]
    public int $velocidade;
}

```

Nesse caso a primeira coisa que precisa ter em mente é que o nome da annotation que usamos no PHP é o nome de uma classe e os parâmetros passados são enviados no construtor. No exemplo acima, usamos a seguinte classe para representar essa anotação:

```php
#[Attribute]
class Validacao {
    public function __construct(
        public string $regra,
        public int $valor
    ){}
}

```

A classe que vai representar o atributo precisa ser marcada com a annotation interna do PHP `#[Attribute]`, conforme a primeira linha do código acima.

Então para pegarmos as meta informações definida nos attributos podemos fazer:

```php
//Cria uma instância de classe reflection com as informações da classe Carro
$informacoesClasseCarro = new reflectionClass(Carro::class);

//Percorre as propriedades da classe Carro
foreach ($informacoesClasseCarro->getProperties() as $propriedade) {
    //Mostra o nome da propriedade	
    echo $propriedade->getName() . ': ';

    //Pega os atributos dessa propriedade em especifico
    $atributosDaPropriedade = $propriedade->getAttributes(Validacao::class);
    //Percorre os atributos definidos na propriedade
    foreach ($atributosDaPropriedade as $atributo) {
        //Cria uma instância da classe que representa a anotação, nesse caso a classe Validacao
        var_dump($atributo->newInstance());
    }
}

```

O código que usamos acima basicamente já existia nas versões anteriores do PHP, único código diferente é o método `getAttributes` que foi criado justamente para obter os dados de atributo de uma classe, método ou propriedade.

No [Github da Treinaweb](https://github.com/treinaweb "Github da Treinaweb") têm esse [exemplo completo de Attributes](https://github.com/treinaweb/treinaweb-curso-novidades-php-8/blob/master/atributos.php "exemplo completo de Attributes"), mostrando também como realizar a validação usando a meta informações que definimos lá na propriedade `$velocidade` da classe Carro.

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

## Considerações Finais

A implementação do recurso de Attributes ou também conhecido como Annotations no PHP 8 é algo muito positivo. Várias bibliotecas e ferramentas já estão definindo usos bem interessantes para esse recursos mesmo antes do lançamento oficial da versão 8 do PHP. O que indica que dentro de algum tempo teremos um uso em massa desse recurso.

- [ #annotations ](https://www.treinaweb.com.br/blog/tag/annotations)
- [ #attributes ](https://www.treinaweb.com.br/blog/tag/attributes)
- [ #php 8 ](https://www.treinaweb.com.br/blog/tag/php-8)

Autor

 ![Elton Fonseca](//secure.gravatar.com/avatar/2cee05645357ced0841ce76ba5569c72?d=mm)

## Elton Fonseca

 Professor e desenvolvedor. Formado em análise e desenvolvimento de sistema, pós graduado em engenharia e arquitetura de software. É autor de cursos em diversos temas, como, desenvolvimento back-end, cloud computing e CMSs. Nas horas vagas adora estudar sobre o mercado financeiro, cozinhar e brincar com pequeno Daniel. [@eltonfonsecadev](https://twitter.com/eltonfonsecadev) 

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

## 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/2021/05/complexity-code-copy-400x280.jpg)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     10 anos atrás

    ##  [ Ferramenta para avaliar a complexidade de código escrito em PHP ](https://www.treinaweb.com.br/blog/ferramenta-para-avaliar-a-complexidade-de-codigo-escrito-em-php) 

     Conheça um pouco mais sobre a phploc, ferramenta para avaliar a complexidade de código escrito em PHP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/12/CAPA-PYTHON-400x280.jpg)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     4 anos atrás

    ##  [ Como trabalhar com data e hora no Python ](https://www.treinaweb.com.br/blog/como-trabalhar-com-data-e-hora-no-python) 

     Como trabalhar com data e hora no Python com Datetime. No decorrer deste artigo, veremos exemplos de como utilizar o módulo datetime...

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/01/15145930/como-aliviar-seus-controllers-com-os-eventos-eloquent-no-laravel-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     9 anos atrás

    ##  [ Como aliviar seus controllers com os eventos do Eloquent no Laravel ](https://www.treinaweb.com.br/blog/como-aliviar-seus-controllers-com-os-eventos-eloquent-no-laravel) 

     Aprenda como os eventos do Eloquent podem te ajudar a diminuir a quantidade de lógica nos controllers de suas aplicações Laravel.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/07/Gutenberg-Wordpress-400x280.png)  [ CMS's e E-commerce ](https://www.treinaweb.com.br/blog/categoria/cmss-e-e-commerce) 

     6 anos atrás

    ##  [ Como usar o novo editor Gutenberg do Wordpress ](https://www.treinaweb.com.br/blog/como-usar-o-novo-editor-gutenberg-do-wordpress) 

     Saiba como utilizar o novo editor Gutenberg do Wordpress, que traz o sistema de blocos na criação de conteúdo.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/01/atributos-html-400x280.jpg)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     4 anos atrás

    ##  [ Entendendo os atributos HTML ](https://www.treinaweb.com.br/blog/entendendo-os-atributos-html) 

     No artigo de hoje, veremos algo que está muito presente no mundo da programação, atributos. Por que são tão importantes para o Front-End?

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/11/diferenca_entre_os_atributos_async_e_defer-400x280.png)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     5 anos atrás

    ##  [ Diferença entre os atributos async e defer ](https://www.treinaweb.com.br/blog/diferenca-entre-os-atributos-async-e-defer) 

     Nesse artigo vamos ver em detalhes como os atributos async e defer se comportam ao declarar seus arquivos JavaScript no HTML.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2022/05/como-instalar-o-csharp-e-nosso-primeiro-exemplo-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     4 anos atrás

    ##  [ Orientação a objetos no C# ](https://www.treinaweb.com.br/blog/orientacao-a-objetos-no-csharp) 

     Aprenda como trabalhar com classes, atributos, métodos e objetos no C# e aumente seus conhecimentos nessa linguagem incrível!

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/01/01132725/PETAPOCO-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     9 anos atrás

    ##  [ Utilizando o Micro ORM PetaPoco em uma aplicação ASP.NET Core ](https://www.treinaweb.com.br/blog/utilizando-o-micro-orm-petapoco-em-uma-aplicacao-asp-net-core) 

     Aprenda a utilizar o Micro ORM PetaPoco em uma aplicação ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/javascript-comandos-do-console-400x280.png)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     5 anos atrás

    ##  [ Trabalhando com data no JavaScript ](https://www.treinaweb.com.br/blog/trabalhando-com-data-no-javascript) 

     Neste artigo veremos como manipular datas no JavaScript, utilizando a classe Date, como pegar a data atual e utilizar os métodos da classe.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/10/tipagem-no-typescript-400x280.png)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     5 anos atrás

    ##  [ Classes no TypeScript ](https://www.treinaweb.com.br/blog/classes-no-typescript) 

     Neste artigo você aprenderá criar classes, implementar métodos e instanciar objetos no TypeScript usando a tipagem adequadamente.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/05/IDE-PYTHON-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     6 anos atrás

    ##  [ Orientação a objetos em Python ](https://www.treinaweb.com.br/blog/orientacao-a-objetos-em-python) 

     Veja neste artigo os principais conceitos do paradigma orientação a objetos e como eles se aplicam no Python.

     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  **15h 34min 55s**

- 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
