最近、継承を処理するときに静的変数/メソッドの問題に遭遇しました。コードは次のようになります。
<?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);
?>
これにより、次の出力が生成されます。
array(3){[0] => string(3) "one" [1] => string(3) "two" [2] => string(5) "three"}
array(6){[0] => string(3) "one" [1] => string(3) "two" [2] => string(5) "three" [3] => string(4) "four" [4] => string(4) "five" [5] => string(3) "six"}
array(6){[0] => string(3) "one" [1] => string(3) "two" [2] => string(5) "three" [3] => string(4) "four" [4] => string(4) "five" [5] => string(3) "six"}
ご覧のとおり、どちらかに追加された値は両方に追加されます。メソッドのstatic::キーワードは親クラスではなく継承されたクラスにバインドすることを理解していたので、これは1つのstatic :: $値のみが作成され、両方がそれを参照していると想定しているという事実に起因すると考えています。価値。これは、ベースから拡張する各クラスでpublic static $ valuesを再宣言することで修正できますが、それぞれが独自の静的コピーを取得するようにこれを行う簡単な方法はありますか?継承されたクラスごとに再宣言する必要をなくすキーワードやトリックはありますか?