В документации ReflectionMethod я не могу найти ничего, чтобы знать, что метод был унаследован от его родительского класса или определен в отраженном классе.
Изменить: я использую ReflectionClass :: getMethods () . Я хочу знать для каждого метода, если он был определен в отраженном классе или если он определен в родительском классе. В конце концов, я хочу сохранить только методы, определенные в текущем классе.
class Foo { function a() {} function b() {} } class Bar extends Foo { function a() {} function c() {} }
Я хочу сохранить a
и c
.
Вы должны иметь возможность вызвать ReflectionMethod :: getDeclaringClass (), чтобы получить класс, объявляющий метод. Затем вызовите ReflectionClass :: getParentClass (), чтобы получить родительский класс. Наконец, вызов ReflectionClass :: hasMethod () скажет вам, был ли метод объявлен в родительском классе.
Пример:
<?php class Foo { function abc() {} } class Bar extends Foo { function abc() {} function def() {} } $bar = new Bar(); $meth = new ReflectionMethod($bar, "abc"); $cls = $meth->getDeclaringClass(); $prnt = $cls->getParentClass(); if ($cls->hasMethod($meth->name)) { echo "Method {$meth->name} in Bar\n"; } if ($prnt->hasMethod($meth->name)) { echo "Method {$meth->name} in Foo\n"; } $meth = new ReflectionMethod($bar, "def"); $cls = $meth->getDeclaringClass(); $prnt = $cls->getParentClass(); if ($cls->hasMethod($meth->name)) { echo "Method {$meth->name} in Bar\n"; } if ($prnt->hasMethod($meth->name)) { echo "Method {$meth->name} in Foo\n"; }
Вы можете получить объект ReflectionMethod
для интересующего вас метода, а затем использовать getPrototype()
для получения ReflectionMethod
метода в родительском классе. Если метод не переопределяет метод в родительском, это вызовет исключение ReflectionClass
.
Следующий примерный код создаст массив с именем метода как ключом и классом, который определяет реализацию, используемую для отраженного класса.
class Base { function basemethod() {} function overridein2() {} function overridein3() {} } class Base2 extends Base { function overridein2() {} function in2only() {} function in2overridein3 () {} } class Base3 extends Base2 { function overridein3() {} function in2overridein3 () {} function in3only() {} } $rc = new ReflectionClass('Base3'); $methods = array(); foreach ($rc->getMethods() as $m) { try { if ($m->getPrototype()) { $methods[$m->name] = $m->getPrototype()->class; } } catch (ReflectionException $e) { $methods[$m->name] = $m->class; } } print_r($methods);
Это напечатает:
Array ( [overridein3] => Base [in2overridein3] => Base2 [in3only] => Base3 [overridein2] => Base [in2only] => Base2 [basemethod] => Base )