基类和继承的静态属性

时间:2012-07-10 16:24:20

标签: php oop 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] =&gt; string(3)“one”[1] =&gt; string(3)“two”[2] =&gt;串(5)   “三”}

     

array(6){[0] =&gt; string(3)“one”[1] =&gt; string(3)“two”   [2] =&GT; string(5)“three”[3] =&gt; string(4)“four”[4] =&gt; string(4)“five”   [5] =&GT; string(3)“six”}

     

array(6){[0] =&gt; string(3)“one”[1] =&gt;   string(3)“two”[2] =&gt; string(5)“three”[3] =&gt; string(4)“four”[4] =&gt;   string(4)“five”[5] =&gt; string(3)“six”}

如您所见,添加到其中的任何值都会添加到两者中。我的理解是方法中的static ::关键字绑定到继承的类,而不是父类,所以我认为这源于这样一个事实,即只创建一个static :: $值,并假设我引用了值。这可以通过在从基础扩展的每个类上重新声明公共静态$值来修复,但有一种更简单的方法来执行此操作,使每个类都获得自己的静态副本吗?任何阻止需要在每个继承类上重新声明的关键字或技巧?

1 个答案:

答案 0 :(得分:0)

  

我认为这源于这样一个事实,即只会创建一个static :: $值并假设我正在引用该值。

正确。

  

这可以通过在从基础扩展的每个类上重新声明公共静态$值来修复,但是有更简单的方法来执行此操作,使每个类都获得自己的静态副本吗?任何阻止需要在每个继承类上重新声明的关键字或技巧?

不,没有那样的东西。但是,诀窍是尽可能避免静态的东西。遇到类似这样的情况时,大部分时间都是您的代码设计需要优化的良好指标。