Sobes.tech
Middle+

Onde a reflexão é aplicada no PHP?

sobes.tech IA

Resposta da IA

A reflexão em PHP é aplicada nos seguintes casos:

  • Estudo da estrutura de classes e objetos em tempo de execução. Isto permite obter informações sobre propriedades, métodos, constantes, anotações (em algumas implementações) de uma classe sem necessidade de conhecer a sua estrutura previamente.
  • Criação dinâmica de objetos e chamadas de métodos. Pode criar instâncias de classes e chamar os seus métodos usando strings com nomes de classes e métodos.
  • Implementação de frameworks e bibliotecas. Os frameworks frequentemente usam reflexão para processar automaticamente configurações, roteamento, injeção de dependências e outros aspetos.
  • Testes. A reflexão pode ser usada para aceder a propriedades/métodos privados e protegidos para fins de teste.
  • Serialização e desserialização de objetos. A reflexão pode ser usada para guardar e restaurar automaticamente o estado de objetos.
  • Processamento de anotações (atributos). Em PHP 8+ a reflexão é usada para obter informações sobre atributos declarados sobre classes, métodos, propriedades e funções.

Exemplo de obtenção de informações sobre métodos de uma classe:

<?php

class MyClass
{
    private $property;

    public function publicMethod(string $param): int
    {
        return 1;
    }

    protected function protectedMethod()
    {
        // ...
    }
}

$reflector = new \ReflectionClass(MyClass::class);
$methods = $reflector->getMethods();

foreach ($methods as $method) {
    echo "Método: " . $method->getName() . "\n";
    echo "Visibilidade: " . ($method->isPublic() ? 'public' : ($method->isProtected() ? 'protected' : 'private')) . "\n";
    // ... pode obter informações sobre parâmetros, tipo de retorno, etc.
}

Exemplo de criação dinâmica de um objeto e chamada de método:

<?php

class AnotherClass
{
    public function greet(string $name): string
    {
        return "Olá, " . $name . "!";
    }
}

$className = 'AnotherClass';
$methodName = 'greet';
$paramValue = 'Mundo';

$reflector = new \ReflectionClass($className);
$object = $reflector->newInstance();

$method = $reflector->getMethod($methodName);
$result = $method->invoke($object, $paramValue);

echo $result; // Vai exibir: Olá, Mundo!