问题的描述:
父类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