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

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

转载于:https://www.cnblogs.com/tudou1223/p/9156979.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值