Учитывая следующий случай:
<?php class ParentClass { public $attrA; public $attrB; public $attrC; public function methodA() {} public function methodB() {} public function methodC() {} } class ChildClass extends ParentClass { public $attrB; public function methodA() {} }
Как я могу получить список методов (и, желательно, класс vars), которые переопределены в ChildClass?
Спасибо, Джо
EDIT: Исправлено плохое расширение. Любые методы, а не только публичные.
Отражение верное, но вам нужно было бы сделать это следующим образом:
$child = new ReflectionClass('ChildClass'); // find all public and protected methods in ParentClass $parentMethods = $child->getParentClass()->getMethods( ReflectionMethod::IS_PUBLIC ^ ReflectionMethod::IS_PROTECTED ); // find all parent methods that were redeclared in ChildClass foreach($parentMethods as $parentMethod) { $declaringClass = $child->getMethod($parentMethod->getName()) ->getDeclaringClass() ->getName(); if($declaringClass === $child->getName()) { echo $parentMethod->getName(); // print the method name } }
То же самое для свойств, просто вы бы использовали getProperties()
.
Вы можете использовать ReflectionClass для достижения этого:
$ref = new ReflectionClass('ChildClass'); print_r($ref->getMethods()); print_r($ref->getProperties());
Это приведет к выводу:
Array ( [0] => ReflectionMethod Object ( [name] => methodA [class] => ChildClass ) ) Array ( [0] => ReflectionProperty Object ( [name] => attrB [class] => ChildClass ) )
См. Руководство для получения более полезной информации об отражении: http://uk3.php.net/manual/en/class.reflectionclass.php