起因
乍聽之下這名詞很新鮮,各位聽眾繼續往下走就知道其實你們是見過的。最近在看《PHP物件導向實踐與設計》中講到了延遲靜態繫結
static
的用法,特此來和大家分享,應該是比較簡單的內容吧。
直接上程式碼
/**
* 功能:子類(學生類,老師類)例項化自己的類
*
*/
abstract class People
{
}
class Student extends People {
public static function create()
{
return new self();
}
}
class Teacher extends People {
public static function create()
{
return new self();
}
}
var_dump(Student::create());
一般情況下,我們們首先想到的是上面的寫法,可以我們程式設計師是“懶惰”的,不可以可以在父類的只寫一個create()
方法呢,那麼大家會首先想到的self()
關鍵字吧(嘿嘿,至少我當時是這麼想的),那我們是實現一下看看:
/**
* 功能:子類例項化自己的類
*
*/
abstract class People
{
public static function create()
{
return new self();
}
}
class Student extends People {
}
class Teacher extends People {
}
var_dump(Student::create());
結果:Fatal error: Uncaught Error: Cannot instantiate abstract class People
。
這個時候就是我們的主角static
登場的時候,修改程式碼如下:
/**
* 功能:子類例項化自己的類
*
*/
abstract class People
{
public static function create()
{
return new static();
}
}
class Student extends People {
}
class Teacher extends People {
}
var_dump(Student::create());
結果: 很完美的輸出了Student類。
結論
哦,原來如此,是因為self
關鍵字指向是當前類(即所在的類)的指標,它所在的People
是抽象類,不能例項化的,他並沒有想我們們所想的那樣,指向呼叫者本身(即Student類)。而static
關鍵字,延遲靜態繫結,它所指向的即使呼叫者本身 (即Student類)。