【PHP】类的继承与延迟静态绑定

问题的描述:

父类A中有

静态属性 static $s_a = 1;

静态方法 static doshow()

且在此静态方法中又使用了静态属性$a (调用方式是 self::$a) ;

子类B继承A ,因此B顺其自然的继承了A的静态属性和静态方法。

类B 对staitc $a 重新进行了定义 static $a = 2 ;

当使用B调用doshow方法时我们发现了问题: $a仍然是A中定义的值并没有使用B中定义的$a

class A{
   static $a = 1;
   public static doshow(){
      echo self::$a;
   }
}
class B extends A{
   static $a = 2;
}

B::doshow(); //此时会输出 1

//如果需要输出B中static $a定义的值 在doshow方法中应该使用 static 
public static doshow()
{
    echo static::$a;
}
//这样调用B::doshow() 就会输出 2

其原因就是: 如果使用self  ,self会在编译时确定其作用域 (既将self替换为类名A)  因此当调用时B:doshow()  这个方法里面的代码是A::$a   

因此我们在doshow方法中使用static调用$a  ,这样$a就会在运行的时候绑定作用域(B::doshow()  这样在运行时才去确定其中$a的作用域 ), 这就是php的延迟静态绑定
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行舟Discuz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值