我最近在处理继承时遇到了静态变量/方法的问题。代码如下所示:
<?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)“二”[2]=>字符串(5)“三”}
数组(6){[0]=>字符串(3)“一”[1]=>字符串(3)“二”[2]=>字符串(5)“三”[3]=>字符串(4) "四" [4]=> 字符串(4) "五" [5]=> 字符串(3) "六" }
数组(6){[0]=>字符串(3)“一”[1]=>字符串(3)“二”[2]=>字符串(5)“三”[3]=>字符串(4) "四" [4]=> 字符串(4) "五" [5]=> 字符串(3) "六" }
如您所见,任何添加到其中的任何值都会添加到两者中。我的理解是方法中的 static:: 关键字绑定到继承的类,而不是父类,所以我认为这源于这样一个事实,即只有一个 static::$values 将被创建并且两者都假设我正在引用那个价值。这可以通过在从基础扩展的每个类上重新声明 public static $values 来解决,但是有没有更简单的方法来做到这一点,这样每个类都可以获得自己的静态副本?是否有任何关键字或技巧可以防止在每个继承的类上重新声明?