理解后期静态绑定
class Grandfather
{
public static $_age = 80;
public static function age()
{
echo self::$_age . '<br/>';
}
//后期静态绑定
public static function staicAge()
{
echo static::$_age . '<br/>';
}
//get_called_class()方式后期静态绑定
public static function getAge()
{
$obj = get_called_class();
echo $obj::$_age;
}
}
class Father extends Grandfather
{
public static $_age = 50;
}
class Son extends Father
{
public static $_age = 20;
}
//测试
Son::age();
Son::staicAge();
Son::getAge();
上述两行的调用大家猜测下最终结果是什么?
20
20
当然是错的。猜测20和20的人都是有一定道理的。结果是:
80
20
为什么呢?当调用age()方法,方法输出self::$_age属性,这时,它在GrandFather类中找到了age()方法,self找到本类的$_age属性,而不是Son,因此输出80。而staticAge()方法使用static::$_age属性,它将在实际运行中找到真实所在类的属性,而不是定义方法所在的类,因此它找到Son类,调用Son类的$_age属性。根据PHP手册所述,不局限与静态方法的调用。若是获得调用的类名,get_called_class方法获取静态方法调用的类名,然后调用属性,如Grandfather的getAge()方法。
转载需经作者允许并注明出处(http://blog.hiunique.com/php/108.html)
来自:你好创造者