我最近在處理繼承時遇到了靜態變量/方法的問題。該代碼讀取這樣的:基類和繼承的靜態屬性
<?php
Class TestBase
{
public static $values;
public static function addValue($value)
{
static::$values[] = $value;
}
}
Class TestOne extends TestBase
{
}
Class TestTwo extends TestBase
{
}
TestOne::addvalue('one');
TestOne::addvalue('two');
TestOne::addvalue('three');
var_dump(TestOne::$values);
echo "<br /><br />";
TestTwo::addvalue('four');
TestTwo::addvalue('five');
TestTwo::addvalue('six');
var_dump(TestTwo::$values);
echo "<br /><br />";
var_dump(TestOne::$values);
?>
這將產生輸出:
陣列(3){[0] =>串(3) 「一」[1] =>串(3 )「two」[2] => string(5) 「three」}
array(6){[0] => string(3)「one」[1] => string(3) (3)=> string(4)「four」[4] => string(4)「five」 [5] => string(3)「 「}
array(6){[0] => string(3)「one」[1] => string(3)「two」[2] => string(5)「three」[3] => string (4) 「四」[4] => 串(4) 「5」[5] =>串(3) 「六」}
正如你可以看到,添加到任任何值相加二者皆是。我的理解是,方法中的靜態::關鍵字綁定到繼承類,而不是父類,所以我認爲這源於這樣一個事實,即只有一個靜態:: $值將被創建,並且都假設我引用了值。這可以通過在每個基類中重新聲明公共靜態$值來解決,但是有沒有更簡單的方法來實現這一點,以便每個類都獲得自己的靜態副本?任何會阻止需要重新聲明每個繼承類的關鍵字或技巧?