【问题标题】:Static properties on base class and inheritance基类和继承的静态属性
【发布时间】:2012-07-10 16:24:19
【问题描述】:

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

<?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) “三”}

array(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 来解决,但是有没有更简单的方法来做到这一点,这样每个类都可以获得自己的静态副本?是否有任何关键字或技巧可以防止在每个继承的类上重新声明?

【问题讨论】:

    标签: php oop inheritance


    【解决方案1】:

    我认为这源于这样一个事实,即只有一个 static::$values 将被创建,并且两者都假设我正在引用该值。

    正确。

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

    不,没有类似的东西。然而,诀窍是尽可能避免静态的东西。当您遇到这样的情况时,这通常是您的代码设计需要一些优化的良好指标。

    【讨论】:

      猜你喜欢
      • 2011-04-16
      • 2016-10-10
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2011-02-13
      • 1970-01-01
      相关资源
      最近更新 更多