PHP中new static 的用法和new self 之間的區別

啥都很少說: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

相關文章
相關標籤/搜索