PHP中的静态延迟绑定static

2018-1-6 chuang_no1

“静态延迟绑定”这个词还挺绕口,但是弄明白了其实超~简~单~的~哦~

父类代码:

class 爹{
    static function 自我介绍(){
        echo '我是你爹';
    }

    static function 你是谁(){
        self::自我介绍();
    }
}

子类代码:

class 儿 extends 爹{
    static function 自我介绍(){
        echo '我是你儿';
    }
}

执行:

儿::你是谁();

结果:

我是你爹

要造反是不?因为在父类中,【你是谁()】方法绑定了父类中的【自我介绍()】,继承后,如果不重写子类的【你是谁()】,那么执行子类的【你是谁()】时,会调用父类中的【你是谁()】,而父类中的【你是谁()】绑定的是父类中的【自我介绍()】。

改进方法:可以在所有子类中重写【你是谁()】方法,覆盖父类的方法,但是在子类很多的项目中恐怕是一个噩梦,所以如果不想每次在子类中都重写【你是谁()】,那么在父类中使用关键字【static】代替【self】即可:

class 爹{
    static function 自我介绍(){
        echo '我是你爹';
    }

    static function 你是谁(){
        //self::自我介绍();
        static:自我介绍();
    }
}

这样,执行【儿:你是谁()】的时候将输出【我是你儿】,也就是将静态方法【你是谁()】绑定静态方法【自我介绍()】的操作延迟到子类中,大约就是静态延迟绑定了。

发表评论:

Powered by emlog