Reflection API

PHP 5 включает в себя полноценный Reflection API, который предоставляет возможность проводить реверс-инжиниринг классов, интерфейсов, функций, методов и модулей. Кроме того, Reflection API позволяет получать doc-блоки комментариев функций, классов и методов.

Обратите внимание, что определённая часть внутреннего API не содержит кода, который необходим для работы модуля Reflection. Например, внутренний PHP-класс может не иметь reflection-данных для своих свойств. Однако это известные ошибки и впоследствии такие классы будут исправлены.

Замечание: с помощью Reflection API нельзя добавить метод к классу динамичеки, для этого следует использовать Closure::bindTo().

Классы

Класс Назначение
ReflectionClass сообщает информацию о классе
ReflectionFunction сообщает информацию о функциях
ReflectionMethod сообщает информацию о методах
ReflectionProperty сообщает информацию о свойствах класса
ReflectionObject сообщает информацию об объектах
ReflectionExtension сообщает информацию о модулях

Интерфейс Reflector

Интерфейс Reflector реализуют все экспортируемые Reflection-классы.

Вызов из shell

В документации по Reflection вы сможете встретить множество примеров, чаще всего в описании конструкторов классов.

Пример использования Reflection из shell (Терминала)

$ php --rf strlen
$ php --rc finfo
$ php --re json
$ php --ri dom

ReflectionClass (исследование класса)

$class_info = new ReflectionClass('CDProduct');
Reflection::export($class_info);

Создав объект типа ReflectionClass, вы можете использовать вспомогательный класс Reflection для создания итоговой информации о классе CDProduct. У класса Reflection есть статический метод export(), который форматирует и создает дамп данных, содержащихся в объекте типа Reflection (точнее, в любом экземпляре класса, который реализует интерфейс Reflector).

  • getName()
  • isUserDefined() - класс определен пользователем
  • isInternal() - встроенный класс
  • isInterface() - это интерфейс
  • isAbstract() - это абстрактный класс
  • isFinal() - это завершенный класс (не поддерживает наследования)
  • isInstantiable() - можно создать экземпляр этого класса
  • getStartLine() - возвращает номер начальной строки в исходном файле
  • getEndLine() — номер последней строки, в которых содержится определение класса

ReflectionUtil (исследование исходного кода)

Класс ReflectionUtil очень прост и содержит единственный статический метод ReflectionUtil::getClassSource().

ReflectionUtil::getClassSource() Этому методу в качестве единственного аргумента передается объект типа ReflectionClass, а он возвращает исходный код класса.