Press "Enter" to skip to content

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  

发表评论