PHP: Reflection API - ReflectionParameter

PHP: Reflection API - ReflectionParameter

Класс ReflectionParameter предоставляет методы для работы с параметрами методов классов, а так же с параметрами функций.

ReflectionParameter implements Reflector

/* Свойства */

  • public $ReflectionParameter->name;

/* Методы */

ReflectionParameter::__construct ( string $function , string $parameter )

Конструктор класса. Первый параметр - строка имя функции, второй параметр... имя параметра который нас интересует:

$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"
}
public bool ReflectionParameter::allowsNull ( void )

Проверка допускает ли параметр значение NULL.

$param = new ReflectionParameter( array('PDO','__construct'), 'dsn' );

if ( $param->allowsNull() )
{
  echo 'Параметр допускает пустое значение';
}
else
{ // Для класса PDO сработает этот блок.
  echo 'Параметр НЕ допускает пустое значение';
}
public bool ReflectionParameter::canBePassedByValue ( void )

Проверка, может ли значение параметра быть передано по ссылке.

public static string ReflectionParameter::export ( string $function , string $parameter [, bool $return ] )

Экспорт отражения параметра. Первый аргумент - строка имя функции, второй - строка имя параметра, третий параметр 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 ]
public ReflectionClass ReflectionParameter::getClass ( void )

Метод возвращает объект класса 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"
}
public ReflectionClass ReflectionParameter::getDeclaringClass ( void )

Возвращает информацию о классе исследуемого параметра

public ReflectionFunction ReflectionParameter::getDeclaringFunction ( void )

Возвращает информацию о функции исследуемого параметра:

$param = new ReflectionParameter('date', 0);
var_dump( $param->getDeclaringFunction() );

выведет:

object(ReflectionFunction) #2 (1) {
  ["name"]= > string(4)"date"
}
public mixed ReflectionParameter::getDefaultValue ( void )

Позволяет получить дефолтное значение параметра:

  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
public string ReflectionParameter::getName ( void )

Получает имя параметра.

public int ReflectionParameter::getPosition ( void )

Получает позицию параметра. Позиции начинаются с нуля!

public bool ReflectionParameter::isArray ( void )

Проверяет, является ли параметр массивом.

public bool ReflectionParameter::isDefaultValueAvailable ( void )

Проверяет, является ли значение по умолчанию параметра - доступным. Если честно я ни хрена не понял про эту штуку.

public bool ReflectionParameter::isOptional ( void )

Проверяет является ли параметр опциональным ( необязательным ).

public bool ReflectionParameter::isPassedByReference ( void )

Проверяет, передается ли параметр по ссылке.

Добавить комментарий


Защитный код
Обновить



Кто на сайте
Сейчас 54 гостей онлайн