你可以得到你所感興趣的方法ReflectionMethod
對象,然後用getPrototype()
得到父類的方法ReflectionMethod
。如果該方法不覆蓋父級中的方法,則會拋出異常。
下面的示例代碼將創建一個數組,其中包含方法名稱作爲鍵以及定義用於反射類的實現的類。
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
)
什麼是你想達到什麼目的? – 2012-02-27 20:37:31
我想知道一個方法是從父類繼承還是在「反映」類中定義(即沒有繼承)。你不明白的是什麼? – 2012-02-27 20:43:58
@Matthieu:你必須要這樣做 - 有一個原因 - 你的最終目標是什麼?我不太熟悉Reflection API,但是你甚至能夠訪問只在父類中定義的方法嗎? – 2012-02-27 20:45:00