您好,登錄后才能下訂單哦!
最近在看laravel的源碼,開始的時(shí)候static關(guān)鍵字的用法讓我讀完一頭霧水,
static不應(yīng)該是用來定義靜態(tài)變量方法和屬性的么?
在方法中
static::setInstance($this);
是什么?
查了手冊才明白,這是static關(guān)鍵字的另一種用法,“后期靜態(tài)綁定”,也可以稱為“靜態(tài)綁定”
http://php.net/manual/zh/language.oop5.late-static-bindings.php
官方的介紹:
該功能從語言內(nèi)部角度考慮被命名為“后期靜態(tài)綁定”。“后期綁定”的意思是說,static:: 不再被解析為定義當(dāng)前方法所在的類,而是在實(shí)際運(yùn)行時(shí)計(jì)算的。也可以稱之為“靜態(tài)綁定”,因?yàn)樗梢杂糜冢ǖ幌抻冢╈o態(tài)方法的調(diào)用。
官方的幾個(gè)例子很好的說明了后期靜態(tài)綁定的意思
self::的限制
使用 self:: 或者 __CLASS__ 對當(dāng)前類的靜態(tài)引用,取決于定義當(dāng)前方法所在的類:
Example #1 self:: 用法
<?php class 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
后期靜態(tài)綁定的用法
后期靜態(tài)綁定本想通過引入一個(gè)新的關(guān)鍵字表示運(yùn)行時(shí)最初調(diào)用的類來繞過限制。簡單地說,這個(gè)關(guān)鍵字能夠讓你在上述例子中調(diào)用 test() 時(shí)引用的類是 B 而不是 A。最終決定不引入新的關(guān)鍵字,而是使用已經(jīng)預(yù)留的 static 關(guān)鍵字。
Example #2 static:: 簡單用法
<?php class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 后期靜態(tài)綁定從這里開始 } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); ?>
輸出:B
在這里static相當(dāng)于self,parent一樣的關(guān)鍵字,用來調(diào)用方法,不過與self不同,static調(diào)用的類并不一定是靜態(tài)屬性和靜態(tài)方法,這點(diǎn)上看更接近于parent這個(gè)關(guān)鍵字的用法。
but,在下面的例子了還看到這樣一種用法
<?php class Model { public static function find() { echo static::$name; } } class Product extends Model { protected static $name = 'Product'; } Product::find(); ?>
在父類里并未定義$name這個(gè)屬性,這時(shí)候在子類里必須
static $name
不過一般程序應(yīng)該不會(huì)出現(xiàn)這種父類沒定義屬性而直接使用的情況吧。
-----------------------------------------------------------------------------------------------------------
另外,測試?yán)拥臅r(shí)候想到這么一個(gè)情況
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();
非靜態(tài)方法可以調(diào)用靜態(tài)方法,反之則不行
laravel設(shè)計(jì)模式中大量使用了這種靜態(tài)綁定的方法,尤其是核心功能Facades。
php面向?qū)ο缶幊踢€有很多東西需要了解。。。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。