Alura > Cursos de Programação > Cursos de PHP > Conteúdos de PHP > Primeiras aulas do curso Metaprogramação com PHP: API de Reflection

Metaprogramação com PHP: API de Reflection

Sobre a Metaprogramação - Introdução

Boas-vindas à Alura. Meu nome é Vinícius Dias, eu vou guiar vocês nesse treinamento de metaprogramação, reflection, e muita mágica utilizando PHP.

Nesse treinamento vamos começar entendendo o que que é metaprogramação e quando faz sentido utilizar, e com os conhecimentos que vamos adquirir nesse treinamento, vamos entender como funciona algumas ferramentas muito famosas do mundo PHP "por baixo dos panos".

Como por exemplo o PHPUnit, como que ele faz para executar os nossos métodos se ele nem sabe o nome deles, ou então o Doctrine, como que ele faz para descobrir o nome das colunas do banco de dados, como que ele faz para ler comentários no nosso código, que são os famosos "Docblocks".

Vamos ver novidades do PHP 8 em relação a isso, essas magias etc. E vamos ver como utilizar a API de reflection do PHP, obviamente depois de entender o que é "reflection".

Vamos ver como inspecionar uma classe já existente para saber o que que ela tem, o que ela deixa de ter.

Nós vamos conseguir acessar seus métodos, suas propriedades, instanciar classes, até mesmo sem chamar seu construtor, vamos acessar propriedades privadas, chamar método privado, e vai fazer muita magia.

Só que antes de ver todas essas partes complexas, vamos começar pelo básico, entendendo conceitos de constantes mágicas do PHP, variáveis variáveis, funções de extensão, enfim, vai ser um treinamento bem teórico.

Vamos aprender bastante coisa legal, sobre como o PHP funciona debaixo dos panos, nesses componentes que eu já citei, como o framework Swag, o PHPUnit, Doctrine, ou qualquer outro ORM.

Espero que esse treinamento agregue muito para sua carreira, eu tenho certeza que vai ajudar, porque isso me ajudou muito a entender como as coisas funcionam.

Se alguma dúvida surgir durante esse treinamento, não hesite, você pode abrir uma dúvida lá no nosso fórum, eu tento responder pessoalmente sempre que possível, mas quando eu não consigo a nossa comunidade de alunos, moderadores, e até instrutores é muito solicita, então, com certeza, alguém vai conseguir te ajudar.

Espero que você tire muito proveito do treinamento, e te espero no próximo vídeo para começarmos a bater um papo sobre todas essas magias que vamos ver no treinamento.

Sobre a Metaprogramação - O que é metaprogramação

Antes de colocar a mão na massa e realmente trabalhar com metaprogramação, precisamos entender o que é essa tal de metaprogramação.

Então eu abri aqui, a famosa Wikipédia, para a conseguirmos dar uma lida mesmo que por alto, em uma definição mais formal do que é metaprogramação, e a partir disso vamos evoluindo.

Então dando uma olhada aqui no texto, a metaprogramação é uma técnica de programação onde programas de computador tem habilidade de tratar outros programas como seu próprio dado, como uma informação que eles vão manipular.

Então isso pode parecer meio confuso, mas além disso ser uma técnica, existe um outro ponto aqui, que eu quero trazer que a habilidade de uma linguagem de programação ser sua própria linguagem, ou seja, eu com PHP, tratar programas em PHP e fazer alguma coisa com código PHP, é chamado de “reflection”.

Então isso tudo pode estar confuso por enquanto mas eu vou dar alguns exemplos para deixar isso bem mais claro, imagine que você está desenvolvendo um framework.

Como já vimos e tem treinamentos aqui na Alura sobre Symfony, sobre Laravel, quando desenvolvemos um framework web, nós precisamos informar as rotas, então eu vou dizer para o framework: "olha, quando essa URL aqui for acessada, eu quero que você instancie uma classe com esse nome, que é o controller, e execute um método com esse nome".

Então passamos as informações em texto para o framework, e o framework consegue ler nosso código em PHP, criar uma classe que tem aquele nome, chamar um método com aquele nome, e então executar, isso é uma técnica de metaprogramação.

E ai o framework consegue inclusive verificar se essa classe existe, que digitamos o nome lá, se aquele método realmente existe, se ele recebe o parâmetro correto, inclusive como vimos nos treinamentos desses frameworks, caso você não tenha visto, sem problema, já estou dando um spoiler aqui.

Mas esses frameworks têm habilidade de receber ou não parâmetros, então o framework, o código em PHP do framework, consegue verificar se aquele método recebe algum parâmetro ou não, e caso receba, ele passa o parâmetro.

Então esse tipo de técnica é o que chamamos de metaprogramação, é pegar um código, e tratar esse código, tratar um programa como se fosse dado e manipular esses dados, manipular métodos de uma classe, descobrir se esse método é público ou privado, esse tipo de coisa, tornar esse método acessível por exemplo.

Um outro exemplo muito claro é o PHPUnit, caso você já tenha feito os treinamentos de teste com PHP aqui na Alura, você sabe que pelo simples fato de começar o nome de um método com test, na nossa classe de testes, o PHPUnit sabe que precisa executá-lo.

Mas como que o PHPUnit sabe a lista de todos os métodos de uma classe, como que ele vai pegar o nome desse método para eu saber se começa com test ou não, então nisso tudo faz parte do conceito de metaprogramação, tratar programas como dados e em cima desses dados manipular, tomar decisões, fazer coisas muito interessantes.

E quando falamos de PHP eu estou aqui em site chamado "PHP: The Right Way", ou "PHP do jeito certo" em inglês, e nós temos uma seção bem pequena sobre metaprogramação, dizendo que o PHP, suporta várias formas de metaprogramação.

Através de mecanismos como reflection, que eu já comentei, o que é e vamos ver a fundo nesse treinamento. Mas também tem outras coisas como, por exemplo, métodos mágicos, que nós já vimos nos treinamentos de programação orientada a objetos.

Então isso é uma espécie de reflection, pegar um código que não existe, por exemplo, um método que não existe, uma propriedade que não existe, ou que seja privada, e permitir acesso.

Então isso é espécie, um pouco mais simples de metaprogramação e o PHP está cheio de funcionalidades de metaprogramação simples assim, e outras muito complexas, e a ideia é que vamos entendendo devagar, passo a passo, como várias coisas funcionam de forma oculta.

Então dessa forma, com esse entendimento, você vai não só poder tomar melhores decisões em casos extremos mas você vai principalmente entender como frameworks funcionam por baixo dos panos, componentes de testes, ORMs, enfim, como ferramentas complexas fazem o que elas fazem.

Então a ideia por trás desse treinamento é te mostrar técnicas de metaprogramação, principalmente você entender como as coisas funcionam por baixo dos panos e em casos extremos podermos lançar a mão desses recursos e utilizar para casos bem particulares.

Com isso, agora que já entendemos, mesmo que por alto e talvez ainda esteja um pouco confuso, mas começamos a entender o que é metaprogramação, vamos começar a falar sobre o que o PHP nos fornece.

Como eu já comentei nós temos reflections, nós temos métodos mágicos, nós temos a API de reflections, temos métodos mágicos, mas vamos dar um passo atrás e ver algumas coisas mais simples antes, para que você comece a ter um gosto do que é, essa tal de metaprogramação na prática.

Então te espero no próximo vídeo para começarmos a praticar de forma bem simples e tranquila.

Sobre a Metaprogramação - Facilidades do PHP

Agora vamos ver um pouco de código, então eu vou fornecer esse exemplo, esse projeto inicial para vocês que é bem básico.

Só tem uma classe, e um arquivo composer.json, então você só vai precisar rodar um composer dump-autoload, para gerar o autoloader, como já estamos habituado.

E aqui temos uma classe de exemplo class ClasseExemplo, com algumas propriedades, sejam públicas, protegidas, privadas, temos aqui um construtor, temos métodos, mas nada complexo, só para termos um código de exemplo para começar a brincar com ele.

Só que antes mesmo de brincarmos com esse código, deixa eu criar um novo arquivo aqui, e vou chamar esse arquivo de "teste", pode chamar do que você preferir.

Já vou fazer um require_once 'vendor/autoload.php'; e aqui eu vou brincar um pouco com algumas coisas, para você conhecer um pouco da mágica da metaprogramação.

Antes de acessarmos classes que nem conhecemos, de chamar métodos sem saber o nome dele, esse tipo de coisa, vamos falar do básico, imagina que eu tenho aqui uma variável, uma variável idade, que contenha o inteiro 22, $idade = 22.

Basicamente a minha idade, eu consigo extrair informações dessa variável, como já vimos em treinamentos anteriores, por exemplo, eu posso pegar o tipo dessa variável, echo gettype($idade), só que isso isso não necessariamente é metaprogramação, isso aqui é bem simples, mas eu quero começar do começo.

Então deixa eu executar esse código aqui, só para vermos, começar a ter uma saída, então nós temos aqui a informação de que nós temos um inteiro, ótimo, só que imagina que eu receba um texto.

E a partir de um texto eu queira acessar uma variável com esse nome, por exemplo, a variável vai ser idade, $variavel = ‘idade’; esse é o nome da variável idade, então eu quero a partir dessa variável aqui, acessar o valor 22, em PHP isso é muito fácil.

Nós temos o conceito de variáveis variáveis, então a partir dessa sintaxe aqui, echo $$variável, eu consigo acessar uma variável variável, o que que isso quer dizer?

O PHP vai avaliar isso da seguinte forma, ele vai pegar até esse primeiro dólar aqui $variavel, e vai pegar o valor dessa variável, variável chamada variável, e qual o valor dessa variável? É idade, então ele vai substituir aqui por idade, então depois ele vai avaliar isso acessando o valor da variável idade que vai ser 22.

Se eu executo esse código, deixa eu clicar em rodar, eu tenho ali como resultado "22", então aqui já começamos ter uma noção de como funciona, como é fácil trabalhar com algumas espécies de metaprogramação com PHP, como que é fácil fazer algumas magias com PHP.

E vamos evoluir devagar, vamos pensar aqui nessa classe exemplo, então deixa inclusive importar ela, ClasseExemplo, importar, e temos aqui o nome completo dessa classe, Alura\Reflection\ClasseExemplo;, então deixa eu até copiar e colar aqui embaixo, nomeCompletoClasse = Alura\Reflection\ClasseExemplo;.

A partir desse nome completo, caso você já tenha visto o curso de MVC por exemplo, você sabe como instanciar um objeto desse tipo, às vezes temos essa informação vindo de algum lugar, por exemplo de uma configuração de rotas.

Sabemos o nome da classe, mas não temos uma instância, não temos um objeto, então eu quero criar um instância dessa classe a partir do seu nome, como que eu posso fazer isso?

Com PHP é muito simples, simplesmente faço new e a variável o nome completo da classe por exemplo, ficando o código new $nomeCompletoClasse();, com isso eu já vou ter aqui uma instância de classe exemplo, então quando eu rodo esse código.

Mais uma vez eu vou ter lá, beleza, tenho o meu objeto definido corretamente, inclusive executando corretamente o construtor, sem problema nenhum.

E nesse ponto acho que é legal falarmos de algumas interessante que o PHP traz também, quando eu dou uma olhada aqui nessa classe, repara que eu tenho uma constante mágica, o PHP tem várias mágicas bem interessantes, e as constantes mágicas são umas das mais simples de entender.

Quando eu tenho uma constante mágica no PHP, basicamente ela não é uma constante.

O valor dela vai depender de onde ela está, então se essa minha constante, underline underline class underline underline, __CLASS__ está dentro da classeExemplo, o valor dela vai ser o nome completo de classe exemplo, como vimos nesse exemplo, deixa eu rodar de novo porque eu não sei abrir aquela tela que eu diminui.

Então como vimos aqui executando o construtor de e o nome completo da classe, então quando voltamos aqui construtor de o nome completo da classe é exibida substituído aqui por essa constante __CLASS__.

E nós já vimos outras constantes mágicas em vários treinamentos aqui na Alura, como por exemplo, __DIR, essa constante aqui, te informa, ela nos traz o valor absoluto, caminho absoluto do arquivo atual, do arquivo onde essa constante está.

Então se eu fizer um echo aqui no final, na verdade eu vou fazer no inicio porque eu já tenho bastante coisa aqui.

Logo no inicio eu vou fazer um echo dessa variável __DIR__ - PHP_EOL e vou quebrar a linha, e aqui quebra de linha não é uma constante mágica, independente do local onde essa constante estiver, o valor dela vai ser uma quebra de linha.

Já essa daqui, __DIR__ é mágica, e dependendo do local onde ela estiver o valor vai ser diferente, mas vamos continuar, eu sei que por enquanto está bem básico, mas vamos evoluindo.

Vamos lá, repara que aqui eu tenho como caminho /opt/project isso é o caminho de onde está esse meu arquivo, então com isso conseguimos acessar algumas informações e em PHP temos diversas constantes mágicas.

Como já vimos DIR, CLASS, temos aqui o arquivo __FILE__ podemos exibir o arquivo atual, então deixa eu exibir isso aqui também para vocês verem que ele vai exibir /opt/project/teste.php exatamente o que eu esperava.

O que mais temos? A __FUNCTION__ função atual, ou __METHOD__ método atual, o __NAMESPACE__ atual, a __TRAIT__, a __LINE__ a linha do código onde estamos, isso que vai trazer a informação 7, se tudo estiver certo e nada estiver errado, ele deve trazer o número 7, perfeito porque esse código, essa constante está na linha 7.

Então repara que temos acesso a diversas informações, a diversas mágicas dentro do nosso código PHP com formas muito simples, conseguimos acessar de forma muito simples, com variáveis variáveis, instância a partir de um nome, instância a partir de uma variável, constantes mágicas, já falamos sobre métodos mágicos em treinamentos anteriores.

Então essas são só algumas formas de conseguirmos acessar mágicas do PHP, eu gosto de chamar de mágica mas na verdade isso tudo é muito bem explicado, na documentação tem explicação de como funciona cada uma dessas coisas, e aqui você vai entendendo devagar parte a parte.

Agora o que eu quero fazer é inspecionar algo que eu já tenho criado, eu não quero criar nada novo, não quero acessar uma variável a partir de um nome, eu não quero criar um objeto a partir de uma classe, eu quero inspecionar por exemplo, esse objeto aqui.

Quero pegar todas as propriedades que ele tenha, para descobrir quais propriedades, ver o que que eu tenho acesso, quero descobrir se ele possui algum método de determinado nome, quero trabalhar esse tipo de coisa, e para isso vamos aprender algumas funções relativamente mágicas também do PHP, mas no próximo vídeo.

Sobre o curso Metaprogramação com PHP: API de Reflection

O curso Metaprogramação com PHP: API de Reflection possui 110 minutos de vídeos, em um total de 50 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda PHP acessando integralmente esse e outros cursos, comece hoje!

Plus

De
R$ 1.800
12X
R$109
à vista R$1.308
  • Acesso a TODOS os cursos da Alura

    Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

Matricule-se

Pro

De
R$ 2.400
12X
R$149
à vista R$1.788
  • Acesso a TODOS os cursos da Alura

    Mais de 1500 cursos completamente atualizados, com novos lançamentos todas as semanas, emProgramação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Luri, a inteligência artificial da Alura

    Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com Luri até 100 mensagens por semana.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas