php static self 應(yīng)該要掌握的區(qū)別

php static 和 self 都可以調(diào)用類中靜態(tài)的屬性和方法,但是他們還是具備一些本質(zhì)上的不同,稍微不注意就會(huì)釀成程序邏輯錯(cuò)誤,做個(gè)記錄。

兩者相同的時(shí)候

class A{
  public static $ask="hello";  

  public function GetAsk(){
    echo get_called_class()."<br/>";  
    echo self::$ask;
  }
}

$b= new A();
$b->GetAsk();
class A{
  public static $ask="hello";  

  public function GetAsk(){
    echo get_called_class()."<br/>";  
    echo static::$ask;
  }
}

$b= new A();
$b->GetAsk();  

兩者輸出的內(nèi)容都是相同:A以及hello。

可見 當(dāng)兩者在非繼承情況下,表現(xiàn)得一致。

兩者展現(xiàn)差異的時(shí)候

class A{
  public static $ask="hello";  

  public function GetAsk(){
    echo get_called_class()."<br/>";  
    echo self::$ask;//hello  
    echo static::$ask;
  }
}  

class B extends A{  
    public static $ask="nihao";  
    public function GetNIhao(){
        echo self::$ask; 

echo static::$ask;
    }
} 

$b= new B();
$b->GetNIhao();  //   都輸出 nihao
class A{
  public static $ask="hello";  

  public function GetAsk(){
    echo get_called_class()."<br/>";  
    echo self::$ask;      //hello  
    echo static::$ask;  //nihao
  }
}  

class B extends A{  
    public static $ask="nihao";  
    public function GetNIhao(){
        echo self::$ask; 

echo static::$ask;
    }
} 

$b= new B();
$b->GetAsk();  //  

這個(gè)時(shí)候,static輸出“nihao”,self輸出“hello”。

我們可以看到 static 表示維持,self代表定義。

總結(jié)

static始終會(huì)維持調(diào)用者內(nèi)存地址,上面代碼中static始終指向$b所代表的的實(shí)例對(duì)象,在運(yùn)行的時(shí)候就會(huì)優(yōu)先去 本身類的定義域中去尋找存不存在該變量。

self就很粗暴,不管你是哪個(gè)類,它只看被調(diào)用的方法或者屬性變量定義在哪里,比如定義在父類($ask),那self就代表父類的地址引用。

所以static表示維持(維持調(diào)用者指針),self代表本身(定義者)。

還有一點(diǎn):
new static / new self 他們之間的區(qū)別

一樣的原則:static維持,self定義。

new操作符會(huì)產(chǎn)生一個(gè)新的實(shí)例對(duì)象,那么問題就是,到底是哪個(gè)類的實(shí)例?
當(dāng)我們沒得選的時(shí)候,他們表現(xiàn)的一致(沒有繼承的情況下)。
當(dāng)存在繼承,static看誰(shuí)在調(diào)用,self看唄調(diào)用的變量或者方法定義在哪里。

這一切討論的前提是:面向?qū)ο蟆?/p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,628評(píng)論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評(píng)論 19 139
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,592評(píng)論 30 472
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,032評(píng)論 0 9
  • 《癡》 癡癡的 我望著 你傻傻的笑 那樣甜美 我為你心醉 想愛你不悔 (2005年)
    點(diǎn)點(diǎn)星燈閱讀 197評(píng)論 0 1

友情鏈接更多精彩內(nèi)容