今天遇到了这样一个问题,如下代码:
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 '
';
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 '
';
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 '
';
print_r($array);
最后结果:Array
(
[0] => funcBa
[1] => funcBb
[2] => funcBc
[3] => funcAa
)
完成,关于 ReflectionClass 更多的知识请参考手册