
Класс 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.