基类和继承的静态属性


Static properties on base class and inheritance

我最近在处理继承时遇到了一个静态变量/方法的问题。代码的内容如下:

<?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(三)"two"[2]=>string(5)"三"}

array(6){[0]=>string(3)"one"[1]=>string(三)"two"[2] =>字符串(5)"三"[3]=>字符串(4)"四"[4]=>字符串(四)"五"[5] =>字符串(3)"六"}

array(6){[0]=>string(3)"one"[1]=>string(3)"二"[2]=>string(5)"三"[3]=>string(4)"四"[4]=>字符串(4)"五"[5]=>字符串(3)"六"}

正如您所看到的,任何添加到其中一个的值都会添加到两者。我的理解是,方法中的static::关键字绑定到继承的类,而不是父类,所以我认为这源于这样一个事实,即只会创建一个static::$值,并且两者都假设我引用了该值。这可以通过在从基扩展的每个类上重新声明公共静态$值来解决,但有没有一种更简单的方法可以做到这一点,即每个类都获得自己的静态副本?是否有任何关键字或技巧可以防止在每个继承类上重新声明?

我认为这源于这样一个事实,即只会创建一个静态值::$,并且两者都认为我引用的是该值。

正确。

这可以通过在从基扩展的每个类上重新声明公共静态$值来解决,但有没有一种更简单的方法可以做到这一点,即每个类都获得自己的静态副本?是否有任何关键字或技巧可以防止在每个继承类上重新声明?

不,没有这样的事。然而,诀窍是尽可能避免静态的东西。当你遇到这样的情况时,大多数时候这是一个很好的指标,表明你的代码设计需要一些优化。