本文主题是后期静态绑定,探讨在继承范围内,通过self和static调用静态方法时,实际指向的类是父类还是子类。
使用魔术变量Class, 输出实际指向的类名。实例化Son
类后,在使用selfGet
时调用的是父类的hello
方法, 在使用staticGet
调用的是子类的hello
方法。
class Father{
public static function hello()
{
echo __Class__;
}
public static function selfGet()
{
echo self::hello();
}
public static function staticGet()
{
echo static::hello();
}
}
class Son extends Father{
public static function hello()
{
echo __Class__;
}
}
(new Son)::selfGet();//输出结果father
echo "<br>";
(new Son)::staticGet();//输出结果son
这是因为使用self
调用静态方法时,是在子类未实例化调用之前就已经绑定完毕,所以他原先在父类中指向的就是父类中的方法。而static
是在实例化的时候才进行绑定指向的是此时实例化的类,也就是子类。