@cybernoob

Зачем нужен RreflectionClass?

Не очень понимаю назначение и практические случаи применения этой штуки php.net/manual/ru/class.reflectionclass.php при том, что можно так:
class My {
   function __construct($arr) {
       var_dump($arr);
   }
}

$class = 'My';
$a = new $class([1,2]);
  • Вопрос задан
  • 119 просмотров
Решения вопроса 4
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Еще один хороший пример использования ReflectionClass - Dependency Resolution в контейнере Laravel.
Вот недавно как раз Dayle Rees интересный материальчик публиковал на эту тему.

Я лично использую в своем абстрактном классе для WordPress плагинов, он позволяет крепко подружить имплементацию с абстрактом в обратную сторону (в WP это местами нужно, особенно в больших проектах).

При написании всяких performance-анализаторов и дебаггеров, Reflection* позволяет собирать Stack Traces и прочую полезную инфу.

В общем, в некоторых случаях - незаменимая штука. Но не на каждый день.
Ответ написан
Комментировать
27cm
@27cm
TODO: Написать статус
Хоть и редко, но бывает нужно. Пример, который я помню: нужно было запретить разработчикам добавлять в класс (и его наследников) константы без префиксов "SOME_PREFIX_". Мы написали unit тест, которые через рефлексы получает список всех констант класса и проверяет их названия. В результате константы с неправильным именем не проходили этот тест и заставляли разработчика переписать свой код.

В тестах иногда бывает нужно временно сделать приватное свойство публичным, тут опять на помощь приходит ReflectionClass:
$obj = new TestableClass();
$reflection = new ReflectionClass($obj);

$privatProperty = $reflection->getProperty('privateProperty');
$privatProperty->setAccessible(true);
$privatProperty->setValue($obj, 'value');


Штуки вроде PHP CodeSniffer также используют рефлексы. Ещё пример — phpdoc. Как только возникает задача генерации кода из phpdoc-комментариев, то без рефлексов тут никуда (разве что изобретать свой велосипед для парсинга).
Ответ написан
Комментировать
Minifets
@Minifets
Hello world!!!
Пример практического использования ReflactionClass: https://github.com/baryshev/Annotator/blob/master/...
Ответ написан
Комментировать
@Vasiliy_M
постоянно использую. вот, 4 часа назад написал чудо-проверку на наличие свойств в объекте:

foreach ($validatorAttrs as $validator_property_key => $validator_property_value) {
    // Проверка на наличие в классе таких свойств.
    try {
        $reflection->getProperty($validator_property_key);
    } catch (\ReflectionException $e) {
        throw new \InvalidArgumentException(
            get_class($this) . ": Bad call validator settings on property `$key`: " . $e->getMessage()
        );
    }
    // Устанавливаем свойства валидатора, установленные клиентом.
    $o->$validator_property_key = $validator_property_value;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы