PHP: Reflection API - ReflectionExtension
Класс ReflectionExtension предоставляет методы для работы с расширениями языка. Эта заметка последняя в цикле о Reflection API. В дальнейшем я планирую сделать запись, как с пользой можно применить этот замечательный API
ReflectionExtension implements Reflector
/* Свойства */
- $ReflectionFunction->name
/* Методы */
Конструктор класса. Принимает параметр строку - имя расширения:
var_dump( new ReflectionExtension('PDO') );
результат:
object(ReflectionExtension) #1 (1) { ["name"]= > string(3)"PDO" }
Как всегда получить информацию можно и без создания экземпляра объекта класса ReflectionExtension, воспользовавшись статичным методом export:
var_dump( ReflectionExtension::export('PDO') );
Вывод очень объёмный - я его привёл не полностью:
Extension [ extension #25 PDO version 1.0.4dev ] { - Dependencies { Dependency [ spl (Required) ] } - Functions { Function [ function pdo_drivers ] { - Parameters [0] { } } } - Classes [4] { Class [ class PDOException extends RuntimeException ] { - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [5] { Property [ protected $message ] Property [ protected $code ] Property [ protected $file ] Property [ protected $line ] Property [ public $errorInfo ] } - Methods [9] { Method [ public method __construct ] { - Parameters [3] { Parameter #0 [ $message ] Parameter #1 [ $code ] Parameter #2 [ $previous ] } } ...
Получает список классов расширения. Возвращает массив объектов ReflectionClass, по одному для каждого класса расширения. Если ни один класс не определён, возвращается пустой массив. Для наглядного примера возьмём и передадим как параметр... сам Reflection :
$ext = new ReflectionExtension('Reflection'); var_dump( $ext->getClasses() );
выведет:
Array ( [ReflectionException] => ReflectionClass Object ( [name] => ReflectionException ) [Reflection] => ReflectionClass Object ( [name] => Reflection ) [Reflector] => ReflectionClass Object ( [name] => Reflector ) [ReflectionFunctionAbstract] => ReflectionClass Object ( [name] => ReflectionFunctionAbstract ) [ReflectionFunction] => ReflectionClass Object ( [name] => ReflectionFunction ) [ReflectionParameter] => ReflectionClass Object ( [name] => ReflectionParameter ) [ReflectionMethod] => ReflectionClass Object ( [name] => ReflectionMethod ) [ReflectionClass] => ReflectionClass Object ( [name] => ReflectionClass ) [ReflectionObject] => ReflectionClass Object ( [name] => ReflectionObject ) [ReflectionProperty] => ReflectionClass Object ( [name] => ReflectionProperty ) [ReflectionExtension] => ReflectionClass Object ( [name] => ReflectionExtension ) )
Получает список имен классов, определенных в расширении. Возвращает массив имен классов, определенных в расширении. Если ни один класс не определён, возвращается пустой массив. Возьмём для наглядности так же класс Reflection:
$ext = new ReflectionExtension('Reflection'); var_dump( $ext->getClassNames() );
выведет:
array(11) { [0]=> string(19) "ReflectionException" [1]=> string(10) "Reflection" [2]=> string(9) "Reflector" [3]=> string(26) "ReflectionFunctionAbstract" [4]=> string(18) "ReflectionFunction" [5]=> string(19) "ReflectionParameter" [6]=> string(16) "ReflectionMethod" [7]=> string(15) "ReflectionClass" [8]=> string(16) "ReflectionObject" [9]=> string(18) "ReflectionProperty" [10]=> string(19) "ReflectionExtension" }
Получает массив констант, определённых в расширении:
$ext = new ReflectionExtension('DOM'); var_dump( $ext->getConstants() );
выведет:
array(45) { ["XML_ELEMENT_NODE"]=> int(1) ["XML_ATTRIBUTE_NODE"]=> int(2) ["XML_TEXT_NODE"]=> int(3) ["XML_CDATA_SECTION_NODE"]=> int(4) ["XML_ENTITY_REF_NODE"]=> int(5) ["XML_ENTITY_NODE"]=> int(6) ["XML_PI_NODE"]=> int(7) ["XML_COMMENT_NODE"]=> int(8) ["XML_DOCUMENT_NODE"]=> int(9) ["XML_DOCUMENT_TYPE_NODE"]=> int(10) ["XML_DOCUMENT_FRAG_NODE"]=> int(11) ["XML_NOTATION_NODE"]=> int(12) ["XML_HTML_DOCUMENT_NODE"]=> int(13) ... }
Получает зависимости, перечисляет обязательные и конфликтующие зависимости. Вернёт ассоциативный массив с зависимостями в качестве ключей и в качестве значения статусы зависимостей: Required, Optional, Conflicts.
$ext = new ReflectionExtension('DOM'); var_dump( $ext->getDependencies() );
выведет:
array(2) { ["libxml"]=> string(8) "Required" ["domxml"]=> string(9) "Conflicts" }
Получить функции определенные в расширении. Вернёт ассоциативный массив объектов ReflectionFunction, с ключами - именами функций, определенных в расширении. Если в расширении не определены ни какие функции, возвращается пустой массив:
выведет:
array(18) { ["curl_init"]=> &object(ReflectionFunction)#2 (1) { ["name"]=> string(9) "curl_init" } ["curl_copy_handle"]=> &object(ReflectionFunction)#3 (1) { ["name"]=> string(16) "curl_copy_handle" } ["curl_version"]=> &object(ReflectionFunction)#4 (1) { ["name"]=> string(12) "curl_version" } ["curl_setopt"]=> &object(ReflectionFunction)#5 (1) { ["name"]=> string(11) "curl_setopt" } ... }
Получить директивы .ini - файла, определённых для расширения. Вернёт ассоциативный массив с INI-директивами в качестве ключей с их определенными значениями в качестве значений:
$ext = new ReflectionExtension('MySQL'); var_dump( $ext->getINIEntries() );
выведет:
array(12) { ["mysql.allow_persistent"]=> string(1) "1" ["mysql.max_persistent"]=> string(2) "-1" ["mysql.max_links"]=> string(2) "-1" ["mysql.default_host"]=> string(0) "" ["mysql.default_user"]=> string(0) "" ["mysql.default_password"]=> string(0) "" ["mysql.default_port"]=> string(0) "" ["mysql.default_socket"]=> NULL ["mysql.connect_timeout"]=> string(2) "60" ["mysql.trace_mode"]=> string(0) "" ["mysql.allow_local_infile"]=> string(1) "1" ["mysql.cache_size"]=> string(4) "2000" }
Метод позволяет получить название расширения. Вернёт строку.
Метод позволяет получить версию расширения.
Позволяет получить информацию о расширении. Это будет часть инфы, касающаяся расширения из вывода функции phpinfo()
Последние два метода на своём PHP 5.2 я так и не смог запустить - вылеты с ошибкой: Fatal error Call to undefined method ( несуществующий метод ).
Ну, вот насколько смог я осветил вам функционал Reflection API на нашем "великом и могучем". Класс ReflectionException я рассматривать не стал - там всё стандартно (ну, кроме его типа конечно) и ещё я не стал в каждом классе указывать методы __clone() и __toString() я надеюсь вам они известны, если нет прошу в , откуда кстати и взята эта информация.
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.