PHP: Reflection API — ReflectionClass

PHP: Reflection API - ReflectionClass

Класс ReflectionClass предоставляет инструменты для работы на уровне классов. На самом деле в некоторых случаях вместо имен классов вполне возможно передавать и экзкмпляры объектов.

ReflectionClass implements Reflector

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

  • const integer IS_IMPLICIT_ABSTRACT = 16;
  • const integer IS_EXPLICIT_ABSTRACT = 32;
  • const integer IS_FINAL = 64 ;

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

  • public $ ReflectionClass->name;

/* Методы */

ReflectionClass::__construct ( mixed $argument )

Создает объект класса ReflectionClass. Параметром может быть строка — имя исследуемого класса, или уже созданный объект.

 

class Foo {}

$class = new ReflectionClass(new Foo);

var_dump($class);

выведет:

 

object(ReflectionClass)#1 (1) {

  ["name"]=>string(3) "Foo"

}

public static string ReflectionClass::export ( mixed $argument [, bool $return = false ] )

Предоставляет информацию о классе $className. По своей работе аналогичен Reflection::export() Пример:

 

class Foo

{

  protected $prop1 = 333;  

  protected $prop2 = 555;  

  protected $prop3 = 777;  

   

  public function greeting($name)

  {}

  protected function convertName($name)

  {}

}

 

ReflectionClass::export('Foo');

выведет:

 

Class [  class Foo ] {

  @@ Z:\home\testJQ.loc\www\reflection\test.php 5-15

 

  - Constants [0] {

  }

 

  - Static properties [0] {

  }

 

  - Static methods [0] {

  }

 

  - Properties [3] {

    Property [  protected $prop1 ]

    Property [  protected $prop2 ]

    Property [  protected $prop3 ]

  }

 

  - Methods [2] {

    Method [  public method greeting ] {

      @@ Z:\home\testJQ.loc\www\reflection\test.php 11 - 12

 

      - Parameters [1] {

        Parameter #0 [  $name ]

      }

    }

 

    Method [  protected method convertName ] {

      @@ Z:\home\testJQ.loc\www\reflection\test.php 13 - 14

 

      - Parameters [1] {

        Parameter #0 [  $name ]

      }

    }

  }

}

public mixed ReflectionClass::getConstant ( string $name )

Вернёт значение константы $name, при условии, что константа определена в классе.

 

class Bar

{

  const TYPE = 'some_type';

}

 

$class = new ReflectionClass('Bar');

var_dump($class->getConstant('TYPE'));

выведет:

string(9)"some_type"

public array ReflectionClass::getConstants ( void )

Вернёт ассоциативный массив констант класса и их значений:

 

class Alligator

{

  const TYPE = 'reptile';

  const COLOR = 'green';

  const CHARACTER = 'pure';

}

 

$class = new ReflectionClass('Bar');

var_dump($class->getConstants());

выведет:

 

array(3) {

  ["TYPE"] = > string(9)"some_type"

  ["COLOR"] = > string(5)"green"

  ["CHARACTER"] = > string(4)"pure"

}

public object ReflectionClass::getConstructor ( void )

Вернёт объект класса ReflectionMethod с двумя string — свойствами: name — имя метода конструктора ( например __construct ) и сlass — имя исследуемого класса.

— Не понимаю для чего это в PHP — один хрен конструктор будет: __construct() или имя класса в PHP 4…

 

class Car

{

  public function __construct(){}

}

 

$class = new ReflectionClass('Car');

var_dump($class->getConstructor());    

    

выведет:

 

object(ReflectionMethod) #2 (2) {

  ["name"]= > string(11)"__construct"

  ["class"] = > string(3)"Car"

}   

public array ReflectionClass::getDefaultProperties ( void )

Вернёт ассоциативный массив, ключами которого будут имена свойств, а значениями — значения свойств по-умолчанию, или NULL , если объект не имеет свойств со значениями по умолчанию. Метод не делает различия между статическими и не статическими свойствами и не принимает во внимание модификаторы доступа.

 

class Foo

{

  protected $prop1 = 333;

  protected $prop2 = 555;

  protected $prop3 = 777;

   

  public function greeting($name)

  {}

  protected function convertName($name)

  {}

}

$class = new ReflectionClass('Foo');

var_dump($class->getDefaultProperties());

Результат:

 

array(3) {

  ["prop1"] = > int(333)

  ["prop2"] = > int(555)

  ["prop3"] = > int(777)

}

public string ReflectionClass::getDocComment ( void )

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

public int ReflectionClass::getEndLine ( void )

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

public ReflectionExtension ReflectionClass::getExtension ( void )

Вернёт объект класса ReflectionExtension свойство name, которого содержит название расширения, к которому относится класс:

 

$class = new ReflectionClass('PDO');

var_dump($class->getExtension());

Результат:

 

object(ReflectionExtension) #2 (1) {

  ["name"]= > string(3)"PDO"

}

public string ReflectionClass::getExtensionName ( void )

Вернет строку — название расширения:

 

$class = new ReflectionClass('PDO');

var_dump($class->getExtensionName());

Результат:

string(3)"PDO"

public string ReflectionClass::getFileName ( void )

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

public array ReflectionClass::getInterfaceNames ( void )

Вернёт индексный массив, значениями которого будут string имена интерфейсов которые расширяет исследуемый класс ( учитываются так же интерфейсы родительских классов и интерфейсов — всё по-правильному ).

 

abstract class Woman

{}

interface Koza

{}

interface Sterva

{}

 

class Wife extends Woman implements Koza,Sterva

{}

 

$class = new ReflectionClass('Wife');

var_dump($class->getInterfaceNames());

Результат:

 

array(2) {

  [0] = > string(4)"Koza"

  [1] = > string(6)"Sterva"

}

public array ReflectionClass::getInterfaces ( void )

Вернёт ассоциативный массив, где ключи это имена интерфейсов которые расширяет исследуемый класс, а значения это ссылки на объекты класса ReflectionClass, имеющие свойство name, которое содержит строку — имя интерфейса.

 

abstract class Woman

{}

interface Koza

{}

interface Sterva

{}

 

class Wife extends Woman implements Koza,Sterva

{}

 

$class = new ReflectionClass('Wife');

var_dump($class->getInterfaces());

Результат:

 

array(2) {

  ["Koza"] = > & object(ReflectionClass) #2 (1) {

      ["name"]= > string(4)"Koza"

  }["Sterva"] = > & object(ReflectionClass) #3 (1) {

      ["name"]= > string(6)"Sterva"

  }

}

public object ReflectionClass::getMethod ( string $name )

Вернёт объект класса ReflectionMethod, свойства которого будут заполнены. Аргумент имя исследуемого метода.

 

    class Wife

{

  public function poslatNax()

  {}   

}

 

$class = new ReflectionClass('Wife');

var_dump($class->getMethod('poslatNax'));

Результат:

 

object(ReflectionMethod) #2 (2) {

  ["name"]= > string(9)"poslatNax"

  ["class"] = > string(4)"Wife"

}

public array ReflectionClass::getMethods ([ string $filter ] )

Вернёт индексный массив, значения которого — это ссылки на объекты класса ReflectionMethod. Аргумент: фильтр — любая комбинация следующих констант класса ReflectionMethod:

  • ReflectionMethod::IS_STATIC
  • ReflectionMethod::IS_PUBLIC
  • ReflectionMethod::IS_PROTECTED
  • ReflectionMethod::IS_PRIVATE
  • ReflectionMethod::IS_ABSTRACT
  • ReflectionMethod::IS_FINAL

 

class Wife

{

  public function poslatNax()

  {}

  public function go2shop()

  {}   

  private function go2bed()

  {}

}

 

$class = new ReflectionClass('Wife');

// Запросим только открытые методы:

var_dump($class->getMethods (ReflectionMethod::IS_PUBLIC));

Результат:

 

array(2) {

  [0]=> &object(ReflectionMethod)#2 (2) {

    ["name"]=> string(9) "poslatNax"

    ["class"]=> string(4) "Wife"

  }

  [1]=> &object(ReflectionMethod)#3 (2) {

    ["name"]=> string(7) "go2shop"

    ["class"]=> string(4) "Wife"

  }

}

public int ReflectionClass::getModifiers ( void )

Получить модификаторы доступа. — В контексте класса это:

  • 0 — это обычный класс без модификаторов
  • 32 — это Абстрактный класс
  • 64 — это Финальный класс
  • 128 — это Интерфейс
public string ReflectionClass::getName ( void )

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

 

$reflector = new ReflectionClass('JPlugin');

$reflector->getName(); // Вернёт строку JPlugin

public string ReflectionClass::getNamespaceName ( void )

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

public object ReflectionClass::getParentClass ( void )

Вернёт объект класса ReflectionClass — с единственным свойством name — именем родительского класса:

 

$reflector = new ReflectionClass('JDataBase');

print_r( $reflector->getParentClass() );

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

 

ReflectionClass Object

(

    [name] => JObject

)

public array ReflectionClass::getProperties ([ int $filter ] )

Вернёт индексный массив объектов класса ReflectionProperty — с двумя свойствами: первое — это имя свойства, второе — это имя исследуемого класса. Аргумент — это фильтр в виде следующих констант:

  • ReflectionProperty::IS_STATIC
  • ReflectionProperty::IS_PUBLIC
  • ReflectionProperty::IS_PROTECTED
  • ReflectionProperty::IS_PRIVATE

Думаю с фильтрами всё ясно. А вот пример:

 

class Foo

{

  protected $prop1 = 333;  

  private $prop2 = 555;  

  public $prop3 = 777;  

  public $prop4 = 999;

   

  public function greeting($name)

  {}

  protected function convertName($name)

  {}

}

 

$class = new ReflectionClass('Foo');

var_dump( $class->getProperties(ReflectionProperty::IS_PUBLIC));

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

 

array(2) {

    [0] = > & object(ReflectionProperty) #2 (2) {

      ["name"]= > string(5)"prop3"

      ["class"] = > string(3)"Foo"

    }

    [1] = > & object(ReflectionProperty) #3 (2) {

      ["name"]= > string(5)"prop4"

      ["class"] = > string(3)"Foo"

    }

}

public ReflectionProperty ReflectionClass::getProperty ( string $name )

Смысл тот же, что и у метода выше, но вернёт лишь один объект класса ReflectionProperty. Аргумент — имя свойства исследуемого класса.

public string ReflectionClass::getShortName ( void )

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

public int ReflectionClass::getStartLine ( void )

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

public array ReflectionClass::getStaticProperties ( void )

Вернёт ассоциативный массив где ключи — это имена статических свойств, исследуемого класса, а значение ключей — значение этих свойств.

 

class Foo

{

  protected $prop1 = 333;  

  private $prop2 = 555;  

  public static $prop3 = 777;  

  public static  $prop4 = 999;

}

 

$class = new ReflectionClass('Foo');

var_dump( $class->getStaticProperties());

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

 

array(2) {

  ["prop3"] = > int(777)

  ["prop4"] = > int(999)

}

public mixed ReflectionClass::getStaticPropertyValue ( string $name [, string $default ] )

Вернёт значение запрошенного свойства.

public bool ReflectionClass::hasConstant ( string $name )

Вернёт bool значение, в зависимости от того имеет ли исследуемый класс константу с запрошенным именем, или нет.

public bool ReflectionClass::hasMethod ( string $name )

Вернёт bool значение, в зависимости от того имеет ли исследуемый класс метод с запрошенным именем, или нет.

public bool ReflectionClass::hasProperty ( string $name )

Вернёт bool значение, в зависимости от того имеет ли исследуемый класс свойство с запрошенным именем, или нет.

public bool ReflectionClass::implementsInterface ( string $interface )

Вернёт bool значение, в зависимости от того расширяет ли исследуемый класс интерфейс с таким именем, или нет.

public bool ReflectionClass::inNamespace ( void )

Вернёт bool значение, в зависимости от того находится ли исследуемый класс внутри какого либо пространства имён, или нет.

public bool ReflectionClass::isAbstract ( void )

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

public bool ReflectionClass::isCloneable ( void )

Этот метод позволяет проверить, возможно ли клонировать объект исследуемого класса.

public bool ReflectionClass::isFinal ( void )

Этот метод позволяет проверить, возможно ли расширить исследуемый класс.

public bool ReflectionClass::isInstance ( object $object )

Этот метод позволяет проверить, является ли объект — параметр экземпляром исследуемого класса.

public bool ReflectionClass::isInstantiable ( void )

Этот метод позволяет проверить, возможно ли создать экземпляр класса.

public bool ReflectionClass::isInterface ( void )

Этот метод позволяет проверить, является ли класс интерфейсом.

public bool ReflectionClass::isInternal ( void )

Вернёт bool:true если класс является встроенным классом PHP.

public bool ReflectionClass::isIterateable ( void )

Этот метод позволяет проверить, является ли исследуемый класс итератором.

public bool ReflectionClass::isSubclassOf ( string $class )

Этот метод позволяет проверить, является ли исследуемый класс подклассом указанного класса.

public bool ReflectionClass::isUserDefined ( void )

Вернёт bool:true если класс был объявлен в PHP коде.

public object ReflectionClass::newInstance ( mixed $args [, mixed $… ] )

Создает новый экземпляр исследуемого класса. Аргументы передаются конструктору класса.

 

class One

{

  public function __construct($a='',$b='',$c='',$d='')

  {

    print_r( func_get_args() );

  }  

}

 

$a = 'арг1';

$b = 'арг2';

$c = 'арг3';

 

$reflector = new ReflectionClass('One');

 

$obj1 = $reflector->newInstance($a,$b,$c);

echo '<hr>';

$obj2 = $reflector->newInstanceArgs(array($a,$b,$c));

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

 

Array

(

    [0] => арг1

    [1] => арг2

    [2] => арг3

)

-------------------------

Array

(

    [0] => арг1

    [1] => арг2

    [2] => арг3

)

public object ReflectionClass::newInstanceArgs ([ array $args ] )

Создает новый экземпляр исследуемого класса. Аргументы передаются конструктору класса. Отличие этого метода от метода выше, в том, что в этот метод аргументы передаются в массиве — иногда это бывает нужно. В предыдущем листинге описывается и этот метод.

public object ReflectionClass::newInstanceWithoutConstructor ( void )

В разработке! Создает новый экземпляр исследуемого класса без вызова конструктора. Я думаю может пригодиться, когда в конструкторе инициализируется то, что на момент вызова не нужно, или конструктор приватный.

public void ReflectionClass::setStaticPropertyValue ( string $name , string $value )

Установить значение — $value, статичного свойства — $name.

 

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

PHP: Reflection API — ReflectionExtension

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

PHP: Reflection API — ReflectionFunction

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

PHP: Reflection API — ReflectionParameter

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