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>