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 '
'; $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.

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


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



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