PHP: Reflection API - ReflectionParameter
Класс ReflectionParameter предоставляет методы для работы с параметрами методов классов, а так же с параметрами функций.
ReflectionParameter implements Reflector
/* Свойства */
- public $ReflectionParameter->name;
/* Методы */
Конструктор класса. Первый параметр - строка имя функции, второй параметр... имя параметра который нас интересует:
$param = new ReflectionParameter( 'date', 'format' ); var_dump( $param );
выведет:
object(ReflectionParameter) #1 (1) {
["name"]= > string(6)"format"
}
Вторым параметром можно передать и номер позиции параметра. Нумерация начинается с нуля:
Нумерация позиций параметров начинается с нуля:
$param = new ReflectionParameter( 'date', 0 ); var_dump( $param );
выведет:
object(ReflectionParameter) #1 (1) {
["name"]= > string(6)"format"
}
... - да можно вызывать этот конструктор и для создания отражений параметров методов, хотя в доках на php.net я этого не нашёл. Для этого нужно первым параметром передать индексный массив, первый элемент которого может быть либо строкой - именем класса, либо объектом, а второй элемент это строка - имя метода. Второй параметр может быть так же либо строкой - именем, либо целым числом - номером позиции параметра:
class Foo
{
public function bar($a=456){}
}
$param = new ReflectionParameter( array( 'Foo', 'bar'), 'a' );
$param1 = new ReflectionParameter( array( new Foo, 'bar'), 'a' );
$param2 = new ReflectionParameter( array( new Foo, 'bar'), 0 );
var_dump( $param );
var_dump( $param1 );
var_dump( $param2 );
выведет:
object(ReflectionParameter) #1 (1) {
["name"]= > string(1)"a"
}
object(ReflectionParameter) #2 (1) {
["name"]= > string(1)"a"
}
object(ReflectionParameter) #3 (1) {
["name"]= > string(1)"a"
}
Проверка допускает ли параметр значение NULL.
$param = new ReflectionParameter( array('PDO','__construct'), 'dsn' );
if ( $param->allowsNull() )
{
echo 'Параметр допускает пустое значение';
}
else
{ // Для класса PDO сработает этот блок.
echo 'Параметр НЕ допускает пустое значение';
}
Проверка, может ли значение параметра быть передано по ссылке.
Экспорт отражения параметра. Первый аргумент - строка имя функции, второй - строка имя параметра, третий параметр bool - позволяет указать, куда помещать вывод: true - вернёт из метода как строку, false - выведет на экран. Как и в случае с конструктором класса, первый параметр может быть и массивом, а второй числом:
ReflectionParameter::export('date', 0 ) ; //Parameter #0 [ $format ]
ReflectionParameter::export( array('PDO', '__construct'), 'dsn' ) ; // Parameter #0 [ $dsn ]
ReflectionParameter::export( array('PDO', '__construct'), 0 ) ; // Parameter #0 [ $dsn ]
Метод возвращает объект класса ReflectionClass, если параметр был специфицирован классом (в примере ниже, первый параметр - $c метода foo класса Basic - специфицирован классом SomeClass), и NULL в противном случае. Здесь понятнее будет на примере:
class Basic
{
function foo( SomeClass $c, array $d, MoreClass $e)
{}
}
class SomeClass {}
// Следует заметить, если объявления классов
// на данный момент будут не доступны PHP выдаст:
// Fatal error: Uncaught exception 'ReflectionException' with message 'Class MoreClass does not exist'
class MoreClass {}
$refl = new ReflectionClass('Basic');
$par = $refl->getMethod('foo')->getParameters();
var_dump($par[0]->getClass()->getName()); // выведет SomeClass
var_dump($par[1]->getClass()); // заметьте, тип массив - выдаст NULL
var_dump($par[2]->getClass()); // ReflectionClass info
Эти строки дадут такой результат:
string(9)"SomeClass"
NULL
object(ReflectionClass) #2 (1) {
["name"]= > string(9)"MoreClass"
}
Возвращает информацию о классе исследуемого параметра
Возвращает информацию о функции исследуемого параметра:
$param = new ReflectionParameter('date', 0);
var_dump( $param->getDeclaringFunction() );
выведет:
object(ReflectionFunction) #2 (1) {
["name"]= > string(4)"date"
}
Позволяет получить дефолтное значение параметра:
function foo($test, $bar = 'baz')
{
echo $test . $bar;
}
$function = new ReflectionFunction('foo');
foreach ($function->getParameters() as $param)
{
echo 'Name: ' . $param->getName() . PHP_EOL;
if ($param->isOptional())
{
echo 'Default value: ' . $param->getDefaultValue() . PHP_EOL;
}
echo PHP_EOL;
}
Эти строки дадут такой результат:
Name: test Name: bar Default value: baz
Получает имя параметра.
Получает позицию параметра. Позиции начинаются с нуля!
Проверяет, является ли параметр массивом.
Проверяет, является ли значение по умолчанию параметра - доступным. Если честно я ни хрена не понял про эту штуку.
Проверяет является ли параметр опциональным ( необязательным ).
Проверяет, передается ли параметр по ссылке.
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.
PHP: Reflection API - ReflectionParameter
