啥都很少說:php
舉個栗子:sql
class wangjh{ /** * @return wangjh 實例化self */ public function selfObj(){ return new self(); } /** * @return static 實例化static */ public function staticObj(){ return new static(); } /** * @return string 獲取被調用的類的名稱 */ public function sayClass(){ return get_called_class().'<br>'; } } class extendWangjh extends wangjh{ } class root extends extendWangjh{ } $a = new wangjh(); $aObj = $a->selfObj(); $b = new wangjh(); $bObj = $b->staticObj(); $c = new extendWangjh(); $cObj = $c->selfObj(); $d = new extendWangjh(); $dObj = $d->staticObj(); var_dump($aObj == $bObj); // true var_dump($aObj == $cObj); // true var_dump($cObj == $dObj); // false var_dump($aObj == $dObj); // false //exit; $com = new extendWangjh(); $x = $com->selfObj(); echo $x->sayClass(); // wangjh $con = new extendWangjh(); $y = $con->staticObj(); echo $y->sayClass(); // extendWangjh $mon = new root(); $z = $mon->selfObj(); echo $z->sayClass(); // wangjh $mon = new root(); $c = $mon->staticObj(); echo $c->sayClass(); // root
先來看第一個true 測試
咱們大體能夠理解爲 new self = new static ;spa
在來看第二個true code
咱們理解爲 在 extendWangjh 這個類中的 self 仍是指向了子類,爲何呢?對象
不服 接着作測試 看下面這兩段:繼承
$mon = new root(); $z = $mon->selfObj(); echo $z->sayClass(); // wangjh
$mon = new root(); $c = $mon->staticObj(); echo $c->sayClass(); // root
在這裏作測試居然 new self 仍是說調用了子類:get
咱們這裏進行以下的超前總結: self 關鍵字永遠都是指向 self所在的類中,也就是說,若是你在 A 類中使用了 self 關鍵字 那麼在子類中,沒有對其進行相關的操做(包括從新賦值,從新聲明等),這個類永遠指向的是 A 類!源碼
下面 再看看 new static 是個什麼東西string
在第一 結果 true 中咱們能夠基本看出來當時 new static = new self 的
可是:
var_dump($cObj == $dObj); // false
看這裏 此時同一個對象的 new static != new self 他們居然不相等了!
剛纔已經理解過了 self 永遠都是代碼wangjh類的(由於 extendWangjh 和root 中都沒有作任何的操做),莫非static 已經再也不指向 wangjh 類了嗎?接着看
var_dump($cObj instanceof extendWangjh); // false var_dump($dObj instanceof extendWangjh); // true
這裏說明在 extendWangjh 中的 new self 並非wangjh類的實例化對象 可是 new static 倒是! 這裏更加驗證了咱們上面說的 new self 是代碼了子類! 這裏static 表明的是 extendWangjh ,這樣的話,是否是說static 表明的是子類呢!
看這一段
$mon = new root(); $c = $mon->staticObj(); echo $c->sayClass(); // root
沒錯,好像能夠基本確認了 static 是子類吧!
總結以下:
咱們在實例化一個類的時候,self 是不會隨着繼承鏈傳遞的! static 則是能夠隨着繼承鏈傳遞下去的!
更多源碼,請訪問 http://www.erdangjiade.com/source
網頁特效下載:www.erdangjiade.com/js
更多PHP/Mysql功能:www.erdangjiade.com/php
更多原創模板,盡在 http://www.erdangjiade.com/templates