PHP: Reflection API — ReflectionMethod

PHP: Reflection API - ReflectionMethod

Класс ReflectionMethod предоставляет методы для работы с… методами классов. Мы можем: получить информацию модифицировать доступ, а так же вызвать их. Так же мы имеем доступ к параметрам методов

ReflectionMethod extends ReflectionFunctionAbstract implementsReflector

/* Константы */

  • 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 )

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

 

Возможно Вас заинтересуют эти материалы

PHP: Reflection API — ReflectionExtension

Класс ReflectionExtension предоставляет методы для работы с расширениями языка. Эта заметка последняя в цикле о

PHP: Reflection API — ReflectionFunction

Класс ReflectionFunction предоставляет методы для работы с функциями языка и функциями, определёнными пользователем в коде,

PHP: Reflection API — ReflectionParameter

Класс ReflectionParameter предоставляет методы для работы с параметрами методов классов, а так же с параметрами