<?php class Base { public function foo() { echo __CLASS__.'---foo'; } } class Bar extends Base { public function foo() { echo __CLASS__.'---foo'; } public function foo1() { echo __CLASS__.'---foo1'; } public static function test() { call_user_func_array(['static','foo'],[]); } } //Bar::test(); $class=new ReflectionClass('Bar'); //print_r($class->getMethods()); /*foreach ($class->getProperties() as $property) { var_dump($property); }*/ Bar::foo(); foreach($class->getMethods(ReflectionMethod::IS_STATIC ) as $method) { var_dump($method); } /*oobject(ReflectionMethod)#2 (2) { ["name"]=> string(4) "test" ["class"]=> string(3) "Bar" } */
这边的疑问是 只有test方法声明了static 但是为什么Bar::foo()还是可以调用 但是反射里 是静态方法的只有一个test 到处搜了下也没有标准答案。
可能就是PHP内部转换成了静态方法。用下面的一个人的一句话来描述吧:
php自动转化为静态方法,不用你去new对象而开辟新的内存地址,直接就可以使用该类的方法,该方法也将作为该类的一个成员属性而存在,不因为new对象而占用单独的内存。
既然这样,可能带来的隐患是:如果将变量$name的static去掉便会报错。方法里面的属性必须也都是静态的才能调用。还有就是这个对不是静态的属性是无法调用到的,比如去掉$name的static后,MyPc::$name是不行的。
好处当然也显而易见,能够自动转化为静态方法也就减少了内存的损耗。