你好创造者

理解后期静态绑定

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)
来自:你好创造者

添加评论

icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif