Sobes.tech
Middle+

Unde se aplică reflecția în PHP?

sobes.tech AI

Răspuns de la AI

Reflexia în PHP se aplică în următoarele cazuri:

  • Studierea structurii claselor și obiectelor în timpul execuției. Acest lucru permite obținerea de informații despre proprietăți, metode, constante, adnotări (în unele implementări) ale unei clase fără a fi nevoie să cunoașteți structura acesteia în prealabil.
  • Crearea dinamică a obiectelor și apelarea metodelor. Se pot crea instanțe ale claselor și apela metodele lor folosind șiruri de caractere cu numele claselor și metodelor.
  • Implementarea de framework-uri și biblioteci. Framework-urile folosesc adesea reflecție pentru procesarea automată a configurațiilor, rutare, injecție de dependențe și alte aspecte.
  • Testare. Reflecția poate fi utilizată pentru a accesa proprietăți/metode private și protected în scopuri de testare.
  • Serializare și deserializare a obiectelor. Reflecția poate fi folosită pentru a salva și restaura automat starea obiectelor.
  • Procesarea adnotărilor (atributelor). În PHP 8+ se folosește reflecția pentru a obține informații despre atributele declarate peste clase, metode, proprietăți și funcții.

Exemplu de obținere a informațiilor despre metodele unei clase:

<?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 "Metodă: " . $method->getName() . "\n";
    echo "Vizibilitate: " . ($method->isPublic() ? 'public' : ($method->isProtected() ? 'protected' : 'private')) . "\n";
    // ... se pot obține informații despre parametri, tipul de returnare etc.
}

Exemplu de creare dinamică a unui obiect și apelare a unei metode:

<?php

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

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

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

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

echo $result; // Va afișa: Salut, Lume!