今天遇到了這樣一個問題,如下代碼:
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了。