後期靜態繫結

在 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!