- Функции для работы с классами и объектами
- Функция get_class_methods
- Функция get_class_vars
- Функция get_object_vars
- Функция class_exists
- Функция method_exists
- Функция property_exists
- Функция get_parent_class
- Функции is_subclass_of
- Функция is_a
- Функция get_declared_classes
- Функция get_declared_interfaces
- Функция get_declared_traits
- Функция trait_exists
- ReflectionClass::getMethods
- Возвращаемые значения
- Список изменений
- Примеры
- Смотрите также
- User Contributed Notes 3 notes
Функции для работы с классами и объектами
Сделайте объект какого-нибудь класса. Примените к объекту функцию get_class и узнайте имя класса, которому принадлежит объект.
Сделайте два класса: Test1 и Test2 . Пусть оба класса имеют свойство name . Создайте некоторое количество объектов этих классов и запишите в массив $arr в произвольном порядке. Переберите этот массив циклом и для каждого объекта выведите значение его свойства name и имя класса, которому принадлежит объект.
Функция get_class_methods
Сделайте класс Test с методами method1 , method2 и method3 . С помощью функции get_class_methods получите массив названий методов класса Test .
Создайте объект класса Test , запишите его в переменную $test . С помощью функции get_class_methods получите массив названий методов объекта. Переберите этот массив циклом и в этом цикле вызовите каждый метод объекта.
Функция get_class_vars
Сделайте класс Test с публичными свойствами prop1 и prop2 , а также с приватными свойствами prop3 и prop4 .
Вызовите функцию get_class_vars снаружи класса Test . Выведите массив доступных свойств.
Вызовите функцию get_class_vars внутри класса Test (например, в конструкторе). Выведите массив доступных свойств.
Функция get_object_vars
Сделайте класс Test с публичными свойствами prop1 и prop2 , а также с приватными свойствами prop3 и prop4 . Создайте объект этого класса. С помощью функции get_object_vars получите массив свойств созданного объекта.
Функция class_exists
Пусть у вас есть класс Test1 и нет класса Test2 . Проверьте, что выведет функция class_exists для класса Test1 и для класса Test2 .
Пусть GET параметром в адресную строку передается название класса. Проверьте, существует ли такой класс. Выведите соответствующее сообщение на экран.
Функция method_exists
Сделайте класс Test с методом method1 и без метода method2 . Проверьте, что выведет функция method_exists для метода method1 и для метода method2 .
Пусть GET параметрами в адресную строку передаются название класса и его метод. Проверьте, существует ли такой класс. Если существует — проверьте существование переданного метода. Если и метод существует — создайте объект данного класса, вызовите указанный метод и выведите результат его работы на экран.
Функция property_exists
Сделайте класс Test со свойством prop1 и без свойства prop2 . Проверьте, что выведет функция property_exists для свойства prop1 и для свойства prop2 .
Дан массив со свойствами класса. Дан также класс, имеющий часть из этих свойств. Переберите этот массив циклом, для каждого свойства проверьте, существует ли оно в классе и, если существует, выведите на экран значение этого свойства.
Функция get_parent_class
Сделайте класс ChildClass наследующий от ParentClass . С помощью функции get_parent_class выведите на экран родителя класса ParentClass .
Функции is_subclass_of
Сделайте класс ChildClass наследующий от ParentClass , который в свою очередь наследует от GrandParentClass
С помощью функции is_subclass_of проверьте, является ли класс ChildClass потомком GrandParentClass .
С помощью функции is_subclass_of проверьте, является ли класс ParentClass потомком GrandParentClass .
С помощью функции is_subclass_of проверьте, является ли класс ChildClass потомком ParentClass .
Функция is_a
Сделайте класс ChildClass наследующий от ParentClass . Создайте объект класса ChildClass , запишите его в переменную $obj .
С помощью функции is_a проверьте, принадлежит ли объект $obj классу ChildClass .
С помощью функции is_a проверьте, принадлежит ли объект $obj классу ParentClass .
Функция get_declared_classes
Выведите на экран список всех объявленных классов.
Пусть у вас есть интерфейс iTest1 и нет интерфейса iTest2 .
Проверьте, что выведет функция interface_exists для интерфейса iTest1 и для интерфейса iTest2 .
Функция get_declared_interfaces
Выведите на экран список всех объявленных интерфейсов.
Функция get_declared_traits
Выведите на экран список всех объявленных трейтов.
Функция trait_exists
Пусть у вас есть трейт Trait1 и нет трейта Trait2 .
Проверьте, что выведет функция trait_exists для трейта Trait1 и для трейта Trait2 .
ReflectionClass::getMethods
Фильтрация результата для включения в список только методов с определёнными атрибутами. По умолчанию фильтрации нет.
Комбинация из следующих констант через логическое ИЛИ: ReflectionMethod::IS_STATIC , ReflectionMethod::IS_PUBLIC , ReflectionMethod::IS_PROTECTED , ReflectionMethod::IS_PRIVATE , ReflectionMethod::IS_ABSTRACT , ReflectionMethod::IS_FINAL , так что все методы с любым из перечисленных атрибутов будут возвращены.
Замечание: Обратите внимание, что прочие побитовые операции, к примеру ~ не будут работать так, как ожидается. Другими словами, например, невозможно получить все нестатические методы.
Возвращаемые значения
Массив ( array ) объектов класса ReflectionMethod , отражающих каждый метод.
Список изменений
Примеры
Пример #1 Пример использования ReflectionClass::getMethods()
class Apple public function firstMethod () < >
final protected function secondMethod () < >
private static function thirdMethod () < >
>
?php
$class = new ReflectionClass ( ‘Apple’ );
$methods = $class -> getMethods ();
var_dump ( $methods );
?>
Результат выполнения данного примера:
array(3) < [0]=>object(ReflectionMethod)#2 (2) < ["name"]=>string(11) "firstMethod" ["class"]=> string(5) "Apple" > [1]=> object(ReflectionMethod)#3 (2) < ["name"]=>string(12) "secondMethod" ["class"]=> string(5) "Apple" > [2]=> object(ReflectionMethod)#4 (2) < ["name"]=>string(11) "thirdMethod" ["class"]=> string(5) "Apple" > >
Пример #2 Пример фильтрации результата вызова ReflectionClass::getMethods()
class Apple public function firstMethod () < >
final protected function secondMethod () < >
private static function thirdMethod () < >
>
?php
$class = new ReflectionClass ( ‘Apple’ );
$methods = $class -> getMethods ( ReflectionMethod :: IS_STATIC | ReflectionMethod :: IS_FINAL );
var_dump ( $methods );
?>
Результат выполнения данного примера:
array(2) < [0]=>object(ReflectionMethod)#2 (2) < ["name"]=>string(12) "secondMethod" ["class"]=> string(5) "Apple" > [1]=> object(ReflectionMethod)#3 (2) < ["name"]=>string(11) "thirdMethod" ["class"]=> string(5) "Apple" > >
Смотрите также
- ReflectionClass::getMethod() — Возвращает экземпляр ReflectionMethod для метода класса
- get_class_methods() — Возвращает массив имён методов класса
User Contributed Notes 3 notes
ReflectionClass::getMethods() sorts the methods by class (lowest in the inheritance tree first) then by the order they are defined in the class definition:
class A public function method1 ()
$class = new ReflectionClass ( ‘B’ );
print_r ( $class -> getMethods ());
?>
This will output:
Array
(
[0] => ReflectionMethod Object
(
[name] => method3
[class] => B
)
(
[name] => method4
[class] => B
) [2] => ReflectionMethod Object
(
[name] => method1
[class] => A
) [3] => ReflectionMethod Object
(
[name] => method2
[class] => A
)
Note, for ReflectionClass::getMethods() not all methods in a final class are final, just the ones that have explicit modifier.
If you want to use an and operator for the filter, here is a simple implementation
final class Apple public function publicMethod () < >
public final function publicFinalMethod () < >
protected final function protectedFinalMethod () < >
private static function privateStaticMethod () < >
>
class MyReflection extends ReflectionClass public function __construct ( $argument ) parent :: __construct ( $argument );
>
/**
* (non-PHPdoc)
* @see ReflectionClass::getMethods()
*/
public function getMethods ( $filter = null , $useAndOperator = true ) if ( $useAndOperator !== true ) return parent :: getMethods ( $filter );
>
$methods = parent :: getMethods ( $filter );
$results = array();
$class = new MyReflection ( ‘Apple’ );
$methods = $class -> getMethods ( ReflectionMethod :: IS_FINAL | ReflectionMethod :: IS_PUBLIC );
var_dump ( $methods );
$methods = $class -> getMethods ( ReflectionMethod :: IS_FINAL | ReflectionMethod :: IS_PUBLIC , false );
var_dump ( $methods );
?>
Result:
array(1) [0]=>
object(ReflectionMethod)#4 (2) [«name»]=>
string(17) «publicFinalMethod»
[«class»]=>
string(5) «Apple»
>
>
array(3) [0]=>
&object(ReflectionMethod)#5 (2) [«name»]=>
string(12) «publicMethod»
[«class»]=>
string(5) «Apple»
>
[1]=>
&object(ReflectionMethod)#3 (2) [«name»]=>
string(17) «publicFinalMethod»
[«class»]=>
string(5) «Apple»
>
[2]=>
&object(ReflectionMethod)#6 (2) [«name»]=>
string(20) «protectedFinalMethod»
[«class»]=>
string(5) «Apple»
>
>
Method ReflectionClass::getMethods doesn’t work constantly across different versions of PHP. For following code piece
class Dummy implements Iterator
public function current () <>
public function next () <>
public function key () <>
public function valid () <>
public function rewind () <>
>
$reflection = new ReflectionClass ( ‘Dummy’ );
$aMethods = $reflection -> getMethods ();
echo ‘# of methods: ‘ , count ( $aMethods ), «\n» ;
?>
, it outputs «# of methods: 10» on PHP 5.2.14 and PHP 5.2.17, including all methods defined in the class itself and in the interface no matter if a method has been implemented or overridden; however, it returns «# of methods: 5» on PHP 5.3.5. Based on some other tests did by my colleagues, I assume it also returns «# of methods: 5» on PHP 5.2.10 and PHP 5.3.6.
- ReflectionClass
- __construct
- getAttributes
- getConstant
- getConstants
- getConstructor
- getDefaultProperties
- getDocComment
- getEndLine
- getExtension
- getExtensionName
- getFileName
- getInterfaceNames
- getInterfaces
- getMethod
- getMethods
- getModifiers
- getName
- getNamespaceName
- getParentClass
- getProperties
- getProperty
- getReflectionConstant
- getReflectionConstants
- getShortName
- getStartLine
- getStaticProperties
- getStaticPropertyValue
- getTraitAliases
- getTraitNames
- getTraits
- hasConstant
- hasMethod
- hasProperty
- implementsInterface
- inNamespace
- isAbstract
- isAnonymous
- isCloneable
- isEnum
- isFinal
- isInstance
- isInstantiable
- isInterface
- isInternal
- isIterable
- isIterateable
- isReadOnly
- isSubclassOf
- isTrait
- isUserDefined
- newInstance
- newInstanceArgs
- newInstanceWithoutConstructor
- setStaticPropertyValue
- __toString
- export