本文將對PHP後期靜態綁定功能進行介紹,它主要用於解決在繼承范圍內引用靜態調用的類。
首先來看下面這個例子:
代碼如下:
class Person
{
public static function status()
{
self::getStatus();
}
protected static function getStatus()
{
echo "Person is alive";
}
}
class Deceased extends Person
{
protected static function getStatus()
{
echo "Person is deceased";
}
}
Deceased::status(); //Person is alive
很明顯,結果不是我們預期的,這是因為self::取決於定義時所在的類,而不是運行中的類。為了解決這個問題,你可能會在繼承類中重寫status()方法,更好的解決方案是PHP 5.3後添加了後期靜態綁定的功能。
復制代碼 代碼如下:
class Person
{
public static function status()
{
static::getStatus();
}
protected static function getStatus()
{
echo "Person is alive";
}
}
class Deceased extends Person
{
protected static function getStatus()
{
echo "Person is deceased";
}
}
Deceased::status(); //Person is deceased
可見,static::不在指向當前所在的類,實際上,它是在運行中計算的,強制獲取最終類的所有屬性。
因此,建議,以後不要再使用self::,使用static::