PHP: Reflection API - ReflectionMethod
Класс ReflectionMethod предоставляет методы для работы с... методами классов. Мы можем: получить информацию модифицировать доступ, а так же вызвать их. Так же мы имеем доступ к параметрам методов
ReflectionMethod extends ReflectionFunctionAbstract implements Reflector
- const integer IS_STATIC = 1;
- const integer IS_PUBLIC = 256;
- const integer IS_PROTECTED = 512;
- const integer IS_PRIVATE = 1024;
- const integer IS_ABSTRACT = 2;
- const integer IS_FINAL = 4;
/* Свойства */
- public $ReflectionMethod->name;
- public $class;
/* Методы */
Конструктор класса: первым аргументом может быть, как трока - имя класса, так и реальный объект. Второй параметр это строка - имя метода.
class One { public function __construct($a='',$b='',$c='',$d=''){} protected function foo($a='',$b='',$c=''){} } $reflectMethod = new ReflectionMethod('One','foo'); if($reflectMethod->isProtected()) { // ... метод protected } else { // ... метод не protected }
Экспорт отражения метода. Первый аргумент - строка имя класса, второй - строка имя метода, третий параметр bool - позволяет указать, куда помещать вывод: true - вернёт из метода как строку, false - выведет на экран
class One { public function __construct($a='',$b='',$c='',$d=''){} public function foo($a='',$b='',$c=''){} } ReflectionMethod::export('One','foo',false);
Выведет на экран следующее :
Method [ public method foo ] { @@ Z:\home\testJQ.loc\www\reflection\test.php 10 - 13 - Parameters [3] { Parameter #0 [ $a = '' ] Parameter #1 [ $b = '' ] Parameter #2 [ $c = '' ] } }
Возвращает динамически создаваемое замыкание для исследуемого метода, или NULL в случае ошибки.
Возвращает информацию о классе исследуемого метода. Этот метод, в других контекстах, описывался мною ранее.
Позволяет получить числовое представление модификаторов. Значения будут соответствовать значениям констант класса.
Если в неком классе был определён какой то метод, а потом в классе потомке мы этот метод перегрузили (описали метод с таким же именем). Этот метод вернёт нам метод прототип (если он есть):
class Basic { public function foo($name) { return 'Hello ' . $name; } } class One extends Basic { public function foo($name) { return 'Hello world: ' . $name; } } $reflectionMethod = new ReflectionMethod('One', 'foo'); var_dump($reflectionMethod->getPrototype());
Даст следующий результат:
object(ReflectionMethod) #2 (2) { ["name"]= > string(3)"foo" ["class"] = > string(5)"Basic" }
Вызывает исследуемый метод. Первый параметр - объект для вызова метода. Для статических методов указывается NULL. Далее - ноль или более параметров, передаваемых в метод. Принимается переменное число параметров, которые затем передаются в вызываемый метод.
class SomeClass { public function greeting($name) { return 'Привет '.$name; } } $reflectionMethod = new ReflectionMethod('SomeClass', 'greeting'); echo $reflectionMethod->invoke(new SomeClass(), ' Мир!'); // выведет "Привет Мир!"
То же, что и выше, но вызывает метод, передавая ему массив параметров.
// .. код из листинга выше. echo $reflectionMethod->invokeArgs(new SomeClass(), array(' Мир!') ); // выведет "Привет Мир!"
Проверка, является ли метод абстрактным.
Проверка, является ли метод конструктором класса.
Проверка, является ли метод ДЕструктором класса.
Проверка, является ли метод финальным ( т.е. имеется ли возможность перегрузить его ).
Проверка, является ли метод частным.
Проверка, является ли метод защищённым.
Проверка, является ли метод открытым.
Проверка, является ли метод статичным.
Делает исследуемый метод доступным. Например, можно позволить вызывать защищеныеи частныеметоды. Что бы сделать метод доступным - нужно передать параметр true
/* Унаследованные методы */
Возвращает указатель $this, или NULL в случае ошибки.
Вернёт строку комментария помещённого в файле, где описан класс.
Номер последней строки в исходном файле, где описан класс.
Вернёт информацию о расширении , ввиде объекта ReflectionExtension.
$method = new ReflectionMethod('PDO','query'); var_dump( $method->getExtension() );
Выведет следующее:
object(ReflectionExtension) #2 (1) { ["name"]= > string(3)"PDO" }
Вернёт строку - название расширения
Вернёт строку абсолютный путь к файлу, где описан класс.
Вернёт имя исследуемого класса.
Вернёт строку - имя пространства имён.
Получить число параметров функции, посчитает как обязательные, так и не обязательные.
// Конструктор PDO принимает 4 параметра: // PDO::__construct() ( string $dsn [, string $username [, string $password [, array $driver_options ]]] ) $method = new ReflectionMethod('PDO','__construct'); var_dump( $method->getNumberOfParameters() ); // int(4)
Получить число параметров функции.
// Конструктор PDO принимает 4 параметра: // PDO::__construct() ( string $dsn [, string $username [, string $password [, array $driver_options ]]] ) $method = new ReflectionMethod('PDO','__construct'); var_dump( $method->getNumberOfRequiredParameters() ); // int(3)
Тут получается интересная ситуация: на сайте php.net конструктор класса PDO описывается именно так:
PDO::__construct() ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )
Из чего я делаю вывод, что у него 1(!) - обязательный параметр. А вот метод ReflectionMethod::getNumberOfRequiredParameters - возвращает 3! Кому теперь верить? ... как теперь жить..?
Вернёт индексный массив ссылок на объекты типа ReflectionParameter - представляющих параметры метода.
$method = new ReflectionMethod('PDO','__construct'); var_dump( $method->getParameters () );
Выведет следующее:
array(4) { [0] = > & object(ReflectionParameter) #2 (1) { ["name"]= > string(3)"dsn" } [1] = > & object(ReflectionParameter) #3 (1) { ["name"]= > string(8)"username" } [2] = > & object(ReflectionParameter) #4 (1) { ["name"]= > string(6)"passwd" } [3] = > & object(ReflectionParameter) #5 (1) { ["name"]= > string(7)"options" } }
Вернёт строку - имя класса без имени пространства имён.
Номер начальной строки в исходном файле, где описан класс.
Вернёт массив статичных переменных, объявленных в методе:
class One { protected function foo($a='',$b='',$c='') { static $counter = 1; static $type = 'buggy'; } } $method = new ReflectionMethod(new One,'foo'); var_dump( $method->getStaticVariables () );
Выведет следующее:
array(2) { ["counter"] = > int(1) ["type"] = > string(5)"buggy" }
Проверяет, объявлен ли данный метод или функция в каком либо пространстве имён.
Проверяет, является ли исследуемый метод или функция - замыканием.
Проверяет, является ли метод или функция устаревшей.
Проверяет, является ли метод или функция частью PHP.
Проверяет, является ли метод или функция объявленной пользователем в коде PHP.
Проверка, возвращает ли функция значение "по ссылке"
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.