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, а он возвращает исходный код класса.