php static self 應該要掌握的區別

php static 和 self 都可以調用類中靜態的屬性和方法,但是他們還是具備一些本質上的不同,稍微不注意就會釀成程序邏輯錯誤,做個記錄。

兩者相同的時候

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();  

兩者輸出的內容都是相同:A以及hello。

可見 當兩者在非繼承情況下,表現得一致。

兩者展現差異的時候

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();  //  

這個時候,static輸出“nihao”,self輸出“hello”。

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

總結

static始終會維持調用者內存地址,上面代碼中static始終指向$b所代表的的實例對象,在運行的時候就會優先去 本身類的定義域中去尋找存不存在該變量。

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

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

還有一點:
new static / new self 他們之間的區別

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

new操作符會產生一個新的實例對象,那么問題就是,到底是哪個類的實例?
當我們沒得選的時候,他們表現的一致(沒有繼承的情況下)。
當存在繼承,static看誰在調用,self看唄調用的變量或者方法定義在哪里。

這一切討論的前提是:面向對象。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,210評論 30 471
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,768評論 0 9
  • 《癡》 癡癡的 我望著 你傻傻的笑 那樣甜美 我為你心醉 想愛你不悔 (2005年)
    點點星燈閱讀 175評論 0 1