今天遇到了這樣一個問題,如下代碼:
classA.php
<?php
class ClassA{
public function funcAa(){
}
public function funcAb(){
}
public function funcAc(){
}
}
?>
classB.php
<?php
include './classA.php';
class ClassB extends ClassA{
public function funcBa(){
}
public function funcBb(){
}
public function funcBc(){
}
public function funcAa(){
parent::funcAa();
}
}
$classB = new ClassB;
$classFuncB = get_class_methods($classB);
echo '<pre>';
print_r($classFuncB);
?>
當我需要找出ClassB里面的所有方法的時候結果如下:
Array
(
[0] => funcBa
[1] => funcBb
[2] => funcBc
[3] => funcAa
[4] => funcAb
[5] => funcAc
)
一共6個方法,實際上我不想要繼承了ClassA里面的方法,我只想要ClassB的方法,怎么辦呢?我稍微更改了如下:
$classA = new ClassA; $classB = new ClassB; $classFuncA = get_class_methods($classA); $classFuncB = get_class_methods($classB); echo '<pre>'; print_r(array_diff($classFuncB,$classFuncA));
結果如下:
Array
(
[0] => funcBa
[1] => funcBb
[2] => funcBc
)
少了一個方法 funcAa ,雖然funcAa是 ClassB 從 ClassA那里繼承過來的,但是同樣ClassB也有這個方法,所以不是我想要的結果。
解決方法:
$reflection = new ReflectionClass('ClassB');
print_r($reflection->getMethods());
結果:
Array
(
[0] => ReflectionMethod Object
(
[name] => funcBa
[class] => ClassB
)
[1] => ReflectionMethod Object
(
[name] => funcBb
[class] => ClassB
)
[2] => ReflectionMethod Object
(
[name] => funcBc
[class] => ClassB
)
[3] => ReflectionMethod Object
(
[name] => funcAa
[class] => ClassB
)
[4] => ReflectionMethod Object
(
[name] => funcAb
[class] => ClassA
)
[5] => ReflectionMethod Object
(
[name] => funcAc
[class] => ClassA
)
)
可以看到 [4]、[5] 里面的class 對應的值是ClassA,而其他對應的值都是ClassB。通過這個可以用foreach來實現最后想要的結果:
$reflection = new ReflectionClass('ClassB');
$array = '';
foreach($reflection->getMethods() as $obj){
if($obj->class == $reflection->getName()){ //$reflection->getName() 獲取類名
$array[] = $obj->name;
}
}
echo '<pre>';
print_r($array);
最后結果:
Array
(
[0] => funcBa
[1] => funcBb
[2] => funcBc
[3] => funcAa
)
完成,關於 ReflectionClass 更多的知識請參考手冊
