PHP: Reflection API - ReflectionClass
Класс ReflectionClass предоставляет инструменты для работы на уровне классов. На самом деле в некоторых случаях вместо имен классов вполне возможно передавать и экзкмпляры объектов.
ReflectionClass implements Reflector
/* Константы */
- const integer IS_IMPLICIT_ABSTRACT = 16;
- const integer IS_EXPLICIT_ABSTRACT = 32;
- const integer IS_FINAL = 64 ;
/* Свойства */
- public $ ReflectionClass->name;
/* Методы */
Создает объект класса ReflectionClass. Параметром может быть строка - имя исследуемого класса, или уже созданный объект.
class Foo {} $class = new ReflectionClass(new Foo); var_dump($class);
выведет:
object(ReflectionClass)#1 (1) { ["name"]=>string(3) "Foo" }
Предоставляет информацию о классе $className. По своей работе аналогичен Reflection::export() Пример:
class Foo { protected $prop1 = 333; protected $prop2 = 555; protected $prop3 = 777; public function greeting($name) {} protected function convertName($name) {} } ReflectionClass::export('Foo');
выведет:
Class [ class Foo ] { @@ Z:\home\testJQ.loc\www\reflection\test.php 5-15 - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [3] { Property [ protected $prop1 ] Property [ protected $prop2 ] Property [ protected $prop3 ] } - Methods [2] { Method [ public method greeting ] { @@ Z:\home\testJQ.loc\www\reflection\test.php 11 - 12 - Parameters [1] { Parameter #0 [ $name ] } } Method [ protected method convertName ] { @@ Z:\home\testJQ.loc\www\reflection\test.php 13 - 14 - Parameters [1] { Parameter #0 [ $name ] } } } }
Вернёт значение константы $name, при условии, что константа определена в классе.
class Bar { const TYPE = 'some_type'; } $class = new ReflectionClass('Bar'); var_dump($class->getConstant('TYPE'));
выведет:
string(9)"some_type"
Вернёт ассоциативный массив констант класса и их значений:
class Alligator { const TYPE = 'reptile'; const COLOR = 'green'; const CHARACTER = 'pure'; } $class = new ReflectionClass('Bar'); var_dump($class->getConstants());
выведет:
array(3) { ["TYPE"] = > string(9)"some_type" ["COLOR"] = > string(5)"green" ["CHARACTER"] = > string(4)"pure" }
Вернёт объект класса ReflectionMethod с двумя string - свойствами: name - имя метода конструктора ( например __construct ) и сlass - имя исследуемого класса.
- Не понимаю для чего это в PHP - один хрен конструктор будет: __construct() или имя класса в PHP 4...
class Car { public function __construct(){} } $class = new ReflectionClass('Car'); var_dump($class->getConstructor());
выведет:
object(ReflectionMethod) #2 (2) { ["name"]= > string(11)"__construct" ["class"] = > string(3)"Car" }
Вернёт ассоциативный массив, ключами которого будут имена свойств, а значениями - значения свойств по-умолчанию, или NULL , если объект не имеет свойств со значениями по умолчанию. Метод не делает различия между статическими и не статическими свойствами и не принимает во внимание модификаторы доступа.
class Foo { protected $prop1 = 333; protected $prop2 = 555; protected $prop3 = 777; public function greeting($name) {} protected function convertName($name) {} } $class = new ReflectionClass('Foo'); var_dump($class->getDefaultProperties());
Результат:
array(3) { ["prop1"] = > int(333) ["prop2"] = > int(555) ["prop3"] = > int(777) }
Вернёт строку комментария помещённого в файле, где описан класс, или false в случае, если комментов нет.
Номер последней строки в исходном файле, где описан класс.
Вернёт объект класса ReflectionExtension свойство name, которого содержит название расширения, к которому относится класс:
$class = new ReflectionClass('PDO'); var_dump($class->getExtension());
Результат:
object(ReflectionExtension) #2 (1) { ["name"]= > string(3)"PDO" }
Вернет строку - название расширения:
$class = new ReflectionClass('PDO'); var_dump($class->getExtensionName());
Результат:
string(3)"PDO"
Вернёт строку - абсолютный путь к файлу, где описан исследуемый класс.
Вернёт индексный массив, значениями которого будут string имена интерфейсов которые расширяет исследуемый класс ( учитываются так же интерфейсы родительских классов и интерфейсов - всё по-правильному ).
abstract class Woman {} interface Koza {} interface Sterva {} class Wife extends Woman implements Koza,Sterva {} $class = new ReflectionClass('Wife'); var_dump($class->getInterfaceNames());
Результат:
array(2) { [0] = > string(4)"Koza" [1] = > string(6)"Sterva" }
Вернёт ассоциативный массив, где ключи это имена интерфейсов которые расширяет исследуемый класс, а значения это ссылки на объекты класса ReflectionClass, имеющие свойство name, которое содержит строку - имя интерфейса.
abstract class Woman {} interface Koza {} interface Sterva {} class Wife extends Woman implements Koza,Sterva {} $class = new ReflectionClass('Wife'); var_dump($class->getInterfaces());
Результат:
array(2) { ["Koza"] = > & object(ReflectionClass) #2 (1) { ["name"]= > string(4)"Koza" }["Sterva"] = > & object(ReflectionClass) #3 (1) { ["name"]= > string(6)"Sterva" } }
Вернёт объект класса ReflectionMethod, свойства которого будут заполнены. Аргумент имя исследуемого метода.
class Wife { public function poslatNax() {} } $class = new ReflectionClass('Wife'); var_dump($class->getMethod('poslatNax'));
Результат:
object(ReflectionMethod) #2 (2) { ["name"]= > string(9)"poslatNax" ["class"] = > string(4)"Wife" }
Вернёт индексный массив, значения которого - это ссылки на объекты класса ReflectionMethod. Аргумент: фильтр - любая комбинация следующих констант класса ReflectionMethod:
- ReflectionMethod::IS_STATIC
- ReflectionMethod::IS_PUBLIC
- ReflectionMethod::IS_PROTECTED
- ReflectionMethod::IS_PRIVATE
- ReflectionMethod::IS_ABSTRACT
- ReflectionMethod::IS_FINAL
class Wife { public function poslatNax() {} public function go2shop() {} private function go2bed() {} } $class = new ReflectionClass('Wife'); // Запросим только открытые методы: var_dump($class->getMethods (ReflectionMethod::IS_PUBLIC));
Результат:
array(2) { [0]=> &object(ReflectionMethod)#2 (2) { ["name"]=> string(9) "poslatNax" ["class"]=> string(4) "Wife" } [1]=> &object(ReflectionMethod)#3 (2) { ["name"]=> string(7) "go2shop" ["class"]=> string(4) "Wife" } }
Получить модификаторы доступа. - В контексте класса это:
- 0 - это обычный класс без модификаторов
- 32 - это Абстрактный класс
- 64 - это Финальный класс
- 128 - это Интерфейс
Вернёт имя исследуемого класса.
$reflector = new ReflectionClass('JPlugin'); $reflector->getName(); // Вернёт строку JPlugin
Вернёт строку - имя пространства имён.
Вернёт объект класса ReflectionClass - с единственным свойством name - именем родительского класса:
$reflector = new ReflectionClass('JDataBase'); print_r( $reflector->getParentClass() );
Выведет следующее:
ReflectionClass Object ( [name] => JObject )
Вернёт индексный массив объектов класса ReflectionProperty - с двумя свойствами: первое - это имя свойства, второе - это имя исследуемого класса. Аргумент - это фильтр в виде следующих констант:
- ReflectionProperty::IS_STATIC
- ReflectionProperty::IS_PUBLIC
- ReflectionProperty::IS_PROTECTED
- ReflectionProperty::IS_PRIVATE
Думаю с фильтрами всё ясно. А вот пример:
class Foo { protected $prop1 = 333; private $prop2 = 555; public $prop3 = 777; public $prop4 = 999; public function greeting($name) {} protected function convertName($name) {} } $class = new ReflectionClass('Foo'); var_dump( $class->getProperties(ReflectionProperty::IS_PUBLIC));
Выведет следующее:
array(2) { [0] = > & object(ReflectionProperty) #2 (2) { ["name"]= > string(5)"prop3" ["class"] = > string(3)"Foo" } [1] = > & object(ReflectionProperty) #3 (2) { ["name"]= > string(5)"prop4" ["class"] = > string(3)"Foo" } }
Смысл тот же, что и у метода выше, но вернёт лишь один объект класса ReflectionProperty. Аргумент - имя свойства исследуемого класса.
Вернёт строку - имя класса без имени пространства имён.
Номер первой строки в исходном файле, где описан класс.
Вернёт ассоциативный массив где ключи - это имена статических свойств, исследуемого класса, а значение ключей - значение этих свойств.
class Foo { protected $prop1 = 333; private $prop2 = 555; public static $prop3 = 777; public static $prop4 = 999; } $class = new ReflectionClass('Foo'); var_dump( $class->getStaticProperties());
Выведет следующее:
array(2) { ["prop3"] = > int(777) ["prop4"] = > int(999) }
Вернёт значение запрошенного свойства.
Вернёт bool значение, в зависимости от того имеет ли исследуемый класс константу с запрошенным именем, или нет.
Вернёт bool значение, в зависимости от того имеет ли исследуемый класс метод с запрошенным именем, или нет.
Вернёт bool значение, в зависимости от того имеет ли исследуемый класс свойство с запрошенным именем, или нет.
Вернёт bool значение, в зависимости от того расширяет ли исследуемый класс интерфейс с таким именем, или нет.
Вернёт bool значение, в зависимости от того находится ли исследуемый класс внутри какого либо пространства имён, или нет.
Проверка, является ли метод абстрактным.
Этот метод позволяет проверить, возможно ли клонировать объект исследуемого класса.
Этот метод позволяет проверить, возможно ли расширить исследуемый класс.
Этот метод позволяет проверить, является ли объект - параметр экземпляром исследуемого класса.
Этот метод позволяет проверить, возможно ли создать экземпляр класса.
Этот метод позволяет проверить, является ли класс интерфейсом.
Вернёт bool:true если класс является встроенным классом PHP.
Этот метод позволяет проверить, является ли исследуемый класс итератором.
Этот метод позволяет проверить, является ли исследуемый класс подклассом указанного класса.
Вернёт bool:true если класс был объявлен в PHP коде.
Создает новый экземпляр исследуемого класса. Аргументы передаются конструктору класса.
class One { public function __construct($a='',$b='',$c='',$d='') { print_r( func_get_args() ); } } $a = 'арг1'; $b = 'арг2'; $c = 'арг3'; $reflector = new ReflectionClass('One'); $obj1 = $reflector->newInstance($a,$b,$c); echo '
'; $obj2 = $reflector->newInstanceArgs(array($a,$b,$c));
Выведет следующее :
Array ( [0] => арг1 [1] => арг2 [2] => арг3 ) ------------------------- Array ( [0] => арг1 [1] => арг2 [2] => арг3 )
Создает новый экземпляр исследуемого класса. Аргументы передаются конструктору класса. Отличие этого метода от метода выше, в том, что в этот метод аргументы передаются в массиве - иногда это бывает нужно. В предыдущем листинге описывается и этот метод.
В разработке! Создает новый экземпляр исследуемого класса без вызова конструктора. Я думаю может пригодиться, когда в конструкторе инициализируется то, что на момент вызова не нужно, или конструктор приватный.
Установить значение - $value, статичного свойства - $name.
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.