今天遇到了這樣一個問題,如下代碼:
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 更多的知識請參考手冊
你要確定引入了User類的類定義文件,否則反序列化是不會成功的。
反序列化失敗,$user就不會是User對象的實例,也就不會存在方法getModelName了。