問題
最近寫代碼發現PHP的self關鍵字修飾的屬性在子類中被重寫但其值不變,代碼示例如下:
class Animal
{
public static $name = 'dog';//默認處理狗
public function paly()
{
echo 'I\'m paly with '.self::$name;
}
}
class Cat extends Animal
{
public static $name = 'cat';//默認處理狗
}
$cat = new Cat();
$cat->play();//print-- I'm paly with dog
很多人會以爲輸出 I'm paly with cat
,但並不是,這是爲什麼呢?
是因爲self關鍵字會在編譯時而非運行時確定其作用域。對於這個問題PHP官方在5.3做了彌補,只需要用static替換self就可以了。
class Animal
{
public static $name = 'dog';//默認處理狗
public function paly()
{
echo 'I\'m paly with '.static::$name;
}
}
class Cat extends Animal
{
public static $name = 'cat';//默認處理狗
}
$cat = new Cat();
$cat->play();//print-- I'm paly with cat