Introdução à API de Reflexão do PHP

Olá Habr! Apresento a você a tradução do artigo " Introdução à API de reflexão do PHP ", de Mustafa Magdi .

Como analisar a estrutura de dados em PHP




Entrada


Quando comecei a programar em PHP, não sabia sobre os recursos da API de reflexão . O principal motivo é que não precisei projetar minhas classes, módulos ou pacotes simples. Então eu descobri que isso desempenha um papel importante em muitas áreas. No artigo, consideraremos a API de reflexão nos seguintes pontos:

  1. O que é a API de reflexão ?
  2. Instalação e configuração
  3. Use
  4. Conclusão
  5. Recomendações


1. O que é a API de reflexão


Em ciência da computação, reflexão ou reflexão (o holônimo de introspecção, reflexão em inglês) significa um processo durante o qual um programa pode rastrear e modificar sua própria estrutura e comportamento em tempo de execução. - Wikipedia .
O que significa a capacidade de parar e olhar dentro do seu código ( engenharia reversa )? Vejamos o seguinte trecho de código:

/** * Class Profile */ class Profile { /** * @return string */ public function getUserName(): string { return 'Foo'; } } 

A classe Profile é uma caixa preta. Usando a API do Reflection, você pode ler o que há dentro:

 //  $reflectionClass = new ReflectionClass('Profile'); //    var_dump($reflectionClass->getName()); => output: string(7) "Profile" //    var_dump($reflectionClass->getDocComment()); => output: string(24) "/** * Class Profile */" 

Assim, o ReflectionClass atua como analista da nossa classe Profile , e essa é a ideia principal da API de reflexão .

O PHP fornece a chave para qualquer caixa bloqueada, por isso temos as chaves
para o seguinte:
ReflectionClass : relata informações da classe.
ReflectionFunction : informa informações da função.
ReflectionParameter : Recupera informações sobre os parâmetros de uma função ou método.
ReflectionClassConstant : relata informações constantes da classe.

Você pode estudar a lista completa em php.net

2. Instalação e configuração


Para usar as classes da API de reflexão , não há necessidade de instalar ou configurar nada, pois elas fazem parte do núcleo do PHP.

3. Exemplos de uso


A seguir, alguns exemplos de como podemos usar a API de reflexão :

Exemplo 1:
Obtenha a classe pai para uma classe específica:

 //   class Child extends Profile { } $class = new ReflectionClass('Child'); //     print_r($class->getParentClass()); // ['Profile'] 

Exemplo 2:
Obtenha a documentação para o método getUserName() :

 $method = new ReflectionMethod('Profile', 'getUserName'); var_dump($method->getDocComment()); => output: string(33) "/** * @return string */" 

Exemplo 3:
Pode ser usado como instanceOf e is_a() para validar objetos:

 $class = new ReflectionClass('Profile'); $obj = new Profile(); var_dump($class->isInstance($obj)); // bool(true) //    var_dump(is_a($obj, 'Profile')); // bool(true) //    var_dump($obj instanceof Profile); // bool(true) 

Exemplo 4:
Em algumas situações, você pode ficar preso no teste de unidade e se perguntar: "Como posso testar uma função privada?!"

Não se preocupe, aqui está o truque:

 //    getName() private function getName(): string { return 'Foo'; } $method = new ReflectionMethod('Profile', 'getUserName'); //          if ($method->isPrivate()) { $method->setAccessible(true); } echo $method->invoke(new Profile()); // Foo 

Os exemplos anteriores são bem simples, mas há outros exemplos em que você pode ver como a API do Reflection é usada mais amplamente:
  • Gerador de documentação da API : o pacote lavarel-apidoc-generator faz uso extensivo de ReflectionClass e ReflrectionMethod para obter e posteriormente processar informações sobre blocos de documentação para classes e métodos, e para estilizar esses blocos de código.
  • Container de injeção de dependência : você pode conferir o tópico inteiro aqui

4. Conclusão


O PHP fornece uma API de reflexão completa que ajuda você a alcançar facilmente diferentes áreas das estruturas OOP.

5. Referências



Do tradutor:

Você também pode ver um exemplo do uso da API de reflexão no pacote Codeception na classe Stub .
Esta classe através da reflexão ajuda a mergulhar métodos e propriedades em testes de unidade.

Deve-se acrescentar que a API do Reflection funciona muito lentamente, portanto você não deve se envolver demais. É recomendável usar em testes ou durante a depuração, mas se você puder ficar sem ele, é melhor fazê-lo. E não é recomendado categoricamente para uso no código de trabalho do projeto, como Também não é seguro.

Source: https://habr.com/ru/post/pt433266/


All Articles