Sobes.tech
Middle+

Kde se v PHP používá reflexe?

sobes.tech AI

Odpověď od AI

Reflexe v PHP se používá v následujících případech:

  • Studium struktury tříd a objektů za běhu. To umožňuje získat informace o vlastnostech, metodách, konstantách, anotacích (v některých implementacích) třídy bez nutnosti znát její strukturu předem.
  • Dynamické vytváření objektů a volání metod. Můžete vytvářet instance tříd a volat jejich metody pomocí řetězců s názvy tříd a metod.
  • Implementace frameworků a knihoven. Frameworky často používají reflexi k automatickému zpracování konfigurací, směrování, vkládání závislostí a dalších aspektů.
  • Testování. Reflexe může být použita k přístupu k soukromým a chráněným vlastnostem/metodám pro účely testování.
  • Serializace a deserializace objektů. Reflexe může být použita k automatickému ukládání a obnovování stavu objektů.
  • Zpracování anotací (atributů). V PHP 8+ se reflexe používá k získání informací o atributech deklarovaných nad třídami, metodami, vlastnostmi a funkcemi.

Příklad získání informací o metodách třídy:

<?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 "Metoda: " . $method->getName() . "\n";
    echo "Viditelnost: " . ($method->isPublic() ? 'public' : ($method->isProtected() ? 'protected' : 'private')) . "\n";
    // ... lze získat informace o parametrech, návratovém typu atd.
}

Příklad dynamického vytváření objektu a volání metody:

<?php

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

$className = 'AnotherClass';
$methodName = 'greet';
$paramValue = 'Svět';

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

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

echo $result; // Vypíše: Ahoj, Svět!