关于PHP面向对象 静态方法的疑问

时间:2021-02-23 19:29:30
<?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是不行的。
好处当然也显而易见,能够自动转化为静态方法也就减少了内存的损耗。