php物件導向編程筆記static的後期靜態繫結

來源:互聯網
上載者:User

標籤:php靜態繫結

最近在看laravel的源碼,開始的時候static關鍵字的用法讓我讀完一頭霧水,

static不應該是用來定義靜態變數方法和屬性的嗎?


在方法中

static::setInstance($this);

是什嗎?


查了手冊才明白,這是static關鍵字的另一種用法,“後期靜態繫結”,也可以稱為“靜態繫結”

http://php.net/manual/zh/language.oop5.late-static-bindings.php


官方的介紹:

該功能從語言內部角度考慮被命名為“後期靜態繫結”。“後期綁定”的意思是說,static::  不再被解析為定義當前方法所在的類,而是在實際運行時計算的。也可以稱之為“靜態繫結”,因為它可以用於(但不限於)靜態方法的調用。  


官方的幾個例子很好的說明了後期靜態繫結的意思


self::的限制

使用 self:: 或者 __CLASS__ 對當前類的靜態引用,取決於定義當前方法所在的類:

Example #1 self:: 用法

<?phpclass A {    public static function who() {        echo __CLASS__;    }    public static function test() {        self::who();    }}class B extends A {    public static function who() {        echo __CLASS__;    }}B::test();?>

輸出:A


後期靜態繫結的用法

後期靜態繫結本想通過引入一個新的關鍵字表示運行時最初調用的類來繞過限制。簡單地說,這個關鍵字能夠讓你在上述例子中調用 test() 時引用的類是 B 而不是 A。最終決定不引入新的關鍵字,而是使用已經預留的 static 關鍵字。

Example #2 static:: 簡單用法

<?phpclass A {    public static function who() {        echo __CLASS__;    }    public static function test() {        static::who(); // 後期靜態繫結從這裡開始    }}class B extends A {    public static function who() {        echo __CLASS__;    }}B::test();?>

輸出:B


在這裡static相當於self,parent一樣的關鍵字,用來調用方法,不過與self不同,static調用的類並不一定是靜態屬性和靜態方法,這點上看更接近於parent這個關鍵字的用法。


but,在下面的例子了還看到這樣一種用法

<?phpclass Model{    public static function find()    {        echo static::$name;    }}class Product extends Model{    protected static $name = ‘Product‘;}Product::find();?>

在父類裡並未定義$name這個屬性,這時候在子類裡必須

static $name

不過一般程式應該不會出現這種父類沒定義屬性而直接使用的情況吧。

-----------------------------------------------------------------------------------------------------------


另外,測試例子的時候想到這麼一個情況

class A {    public static function who() {        echo __CLASS__;    }    public function test() {        static::who();    }}class B extends A {    public static function who() {        echo __CLASS__;    }}(new B())->test();

非靜態方法可以調用靜態方法,反之則不行


laravel設計模式中大量使用了這種靜態繫結的方法,尤其是核心功能Facades。

php物件導向編程還有很多東西需要瞭解。。。

php物件導向編程筆記static的後期靜態繫結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.