2

最近、継承を処理するときに静的変数/メソッドの問題に遭遇しました。コードは次のようになります。

<?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を再宣言することで修正できますが、それぞれが独自の静的コピーを取得するようにこれを行う簡単な方法はありますか?継承されたクラスごとに再宣言する必要をなくすキーワードやトリックはありますか?

4

1 に答える 1

0

これは、static :: $ valuesが1つだけ作成され、両方ともその値を参照していると想定しているという事実に起因していると思います。

正しい。

これは、ベースから拡張する各クラスでpublic static $ valuesを再宣言することで修正できますが、それぞれが独自の静的コピーを取得するようにこれを行う簡単な方法はありますか?継承されたクラスごとに再宣言する必要をなくすキーワードやトリックはありますか?

いいえ、そのようなものはありません。ただし、トリックは、静的なものをできるだけ避けることです。このような状況に遭遇した場合、ほとんどの場合、コード設計に最適化が必要であることを示す良い指標になります。

于 2012-07-10T17:23:29.037 に答える