2012-07-10 204 views
1

我最近在处理继承时遇到了静态变量/方法的问题。该代码读取这样的:基类和继承的静态属性

<?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 )“two”[2] => string(5) “three”}

array(6){[0] => string(3)“one”[1] => string(3) (3)=> string(4)“four”[4] => string(4)“five” [5] => string(3)“ “}

array(6){[0] => string(3)“one”[1] => string(3)“two”[2] => string(5)“three”[3] => string (4) “四”[4] => 串(4) “5”[5] =>串(3) “六”}

正如你可以看到,添加到任任何值相加二者皆是。我的理解是,方法中的静态::关键字绑定到继承类,而不是父类,所以我认为这源于这样一个事实,即只有一个静态:: $值将被创建,并且都假设我引用了值。这可以通过在每个基类中重新声明公共静态$值来解决,但是有没有更简单的方法来实现这一点,以便每个类都获得自己的静态副本?任何会阻止需要重新声明每个继承类的关键字或技巧?

回答

0

我想这是源于这样一个事实,即只有一个静态:: $值将被创建,并且都假定我引用该值。

正确。

这可以通过重新声明公共静态$值在每个从基地扩展的类,但有一个更简单的方法来做到这一点,使每个获得自己的静态副本?任何会阻止需要重新声明每个继承类的关键字或技巧?

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