後期靜態繫結
在 PHP 5.3 及更高版本中,你可以利用後期靜態繫結來控制呼叫靜態屬性或方法的類。新增它是為了克服 self::
範圍解析器固有的問題。請使用以下程式碼
class Horse {
public static function whatToSay() {
echo 'Neigh!';
}
public static function speak() {
self::whatToSay();
}
}
class MrEd extends Horse {
public static function whatToSay() {
echo 'Hello Wilbur!';
}
}
你會期望 MrEd
類會覆蓋父 whatToSay()
函式。但是當我們執行這個時,我們會得到一些意外
Horse::speak(); // Neigh!
MrEd::speak(); // Neigh!
問題是 self::whatToSay();
只能引用 Horse
類,這意味著它不服從 MrEd
。如果我們切換到 static::
範圍的 resolutor,我們沒有這個問題。這個更新的方法告訴類遵循呼叫它的例項。因此,我們得到了我們期待的繼承
class Horse {
public static function whatToSay() {
echo 'Neigh!';
}
public static function speak() {
static::whatToSay(); // Late Static Binding
}
}
Horse::speak(); // Neigh!
MrEd::speak(); // Hello Wilbur!