PHP: Reflection API - ReflectionMethod

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;

/* Методы */

ReflectionMethod::__construct ( mixed $class , string $name )

Конструктор класса: первым аргументом может быть, как трока - имя класса, так и реальный объект. Второй параметр это строка - имя метода.

  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
  }
public static string ReflectionMethod::export ( string $class , string $name [, bool $return = false ] )

Экспорт отражения метода. Первый аргумент - строка имя класса, второй - строка имя метода, третий параметр 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 = '' ]
  }
}
public Closure ReflectionMethod::getClosure ( string $object )

Возвращает динамически создаваемое замыкание для исследуемого метода, или NULL в случае ошибки.

public ReflectionClass ReflectionMethod::getDeclaringClass ( void )

Возвращает информацию о классе исследуемого метода. Этот метод, в других контекстах, описывался мною ранее.

public int ReflectionMethod::getModifiers ( void )

Позволяет получить числовое представление модификаторов. Значения будут соответствовать значениям констант класса.

public ReflectionMethod ReflectionMethod::getPrototype ( void )

Если в неком классе был определён какой то метод, а потом в классе потомке мы этот метод перегрузили (описали метод с таким же именем). Этот метод вернёт нам метод прототип (если он есть):

  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"
}
public mixed ReflectionMethod::invoke ( object $object [, mixed $parameter [, mixed $... ]] )

Вызывает исследуемый метод. Первый параметр - объект для вызова метода. Для статических методов указывается NULL. Далее - ноль или более параметров, передаваемых в метод. Принимается переменное число параметров, которые затем передаются в вызываемый метод.

  class SomeClass
  {
      public function greeting($name)
      {
          return 'Привет '.$name;
      }
  }
  
  $reflectionMethod = new ReflectionMethod('SomeClass', 'greeting');
  
  echo $reflectionMethod->invoke(new SomeClass(), ' Мир!'); // выведет "Привет  Мир!"
public mixed ReflectionMethod::invokeArgs ( object $object , array $args )

То же, что и выше, но вызывает метод, передавая ему массив параметров.

  // .. код из листинга выше.
  echo $reflectionMethod->invokeArgs(new SomeClass(), array(' Мир!') ); // выведет "Привет  Мир!"
public bool ReflectionMethod::isAbstract ( void )

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

public bool ReflectionMethod::isConstructor ( void )

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

public bool ReflectionMethod::isDestructor ( void )

Проверка, является ли метод ДЕструктором класса.

public bool ReflectionMethod::isFinal ( void )

Проверка, является ли метод финальным ( т.е. имеется ли возможность перегрузить его ).

public bool ReflectionMethod::isPrivate ( void )

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

public bool ReflectionMethod::isProtected ( void )

Проверка, является ли метод защищённым.

public bool ReflectionMethod::ispublic ( void )

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

public bool ReflectionMethod::isStatic ( void )

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

public void ReflectionMethod::setAccessible ( bool $accessible )

Делает исследуемый метод доступным. Например, можно позволить вызывать защищеныеи частныеметоды. Что бы сделать метод доступным - нужно передать параметр true

/* Унаследованные методы */

public object ReflectionFunctionAbstract::getClosureThis ( void )

Возвращает указатель $this, или NULL в случае ошибки.

public string ReflectionFunctionAbstract::getDocComment ( void )

Вернёт строку комментария помещённого в файле, где описан класс.

public int ReflectionFunctionAbstract::getEndLine ( void )

Номер последней строки в исходном файле, где описан класс.

public ReflectionExtension ReflectionFunctionAbstract::getExtension ( void )

Вернёт информацию о расширении , ввиде объекта ReflectionExtension.

	$method = new ReflectionMethod('PDO','query');
	var_dump( $method->getExtension() );

Выведет следующее:

object(ReflectionExtension) #2 (1) {
  ["name"]= > string(3)"PDO"
}   
public string ReflectionFunctionAbstract::getExtensionName ( void )

Вернёт строку - название расширения

public string ReflectionFunctionAbstract::getFileName ( void )

Вернёт строку абсолютный путь к файлу, где описан класс.

public string ReflectionFunctionAbstract::getName ( void )

Вернёт имя исследуемого класса.

public string ReflectionFunctionAbstract::getNamespaceName ( void )

Вернёт строку - имя пространства имён.

public int ReflectionFunctionAbstract::getNumberOfParameters ( void )

Получить число параметров функции, посчитает как обязательные, так и не обязательные.

	// Конструктор PDO принимает 4 параметра:
	// PDO::__construct() ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )
	$method = new ReflectionMethod('PDO','__construct');
	var_dump( $method->getNumberOfParameters() ); // int(4)
public int ReflectionFunctionAbstract::getNumberOfRequiredParameters ( void )

Получить число параметров функции.

	// Конструктор 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! Кому теперь верить? ... как теперь жить..?

public array ReflectionFunctionAbstract::getParameters ( void )

Вернёт индексный массив ссылок на объекты типа 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"
  }
}   
public string ReflectionFunctionAbstract::getShortName ( void )

Вернёт строку - имя класса без имени пространства имён.

public int ReflectionFunctionAbstract::getStartLine ( void )

Номер начальной строки в исходном файле, где описан класс.

public array ReflectionFunctionAbstract::getStaticVariables ( void )

Вернёт массив статичных переменных, объявленных в методе:

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"
}   
public bool ReflectionFunctionAbstract::inNamespace ( void )

Проверяет, объявлен ли данный метод или функция в каком либо пространстве имён.

public bool ReflectionFunctionAbstract::isClosure ( void )

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

public bool ReflectionFunctionAbstract::isDeprecated ( void )

Проверяет, является ли метод или функция устаревшей.

public bool ReflectionFunctionAbstract::isInternal ( void )

Проверяет, является ли метод или функция частью PHP.

public bool ReflectionFunctionAbstract::isUserDefined ( void )

Проверяет, является ли метод или функция объявленной пользователем в коде PHP.

public bool ReflectionFunctionAbstract::returnsReference ( void )

Проверка, возвращает ли функция значение "по ссылке"

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


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






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