使用array_merge根据父类初始化派生类中的静态类变量

时间:2014-03-13 11:21:10

标签: php oop

更新:解决了!请参阅下文,了解我最终做了什么。谢谢大家,我喜欢这样!


这是一个技术问题,对不起,我还在学习PHP OOP ......

为什么我可以这样做:

<ul>    
<?php 
   class Base {
      public static $array = array(
         'test1' => 'Hello',
      );
   }

   class Derived extends Base {
      public static $array = array(
         'test2' => 'World!'
      );
   }

   foreach (Derived::$array as $key => $value) { 
?>      
   <li><?= $key ?> = <?= $value ?></li>
<?php 
    } 
?>
</ul>

哪个输出:

<ul>
   <li>test2 = World!</li>
</ul>

但不是这个(注意对array_merge的调用):

<ul>    
<?php 
   class Base {
      public static $array = array(
         'test1' => 'Hello',
      );
   }

   class Derived extends Base {
      public static $array = array_merge(parent::$array, array(
         'test2' => 'World!'
      ));
   }

   foreach (Derived::$array as $key => $value) { 
?>      
   <li><?= $key ?> = <?= $value ?></li>
<?php 
    } 
?>
</ul>

哪个会输出(如果允许的话):

<ul>
   <li>test1 = Hello</li>
   <li>test2 = World!</li>
</ul>

第二个例子给我一个语法错误:

  

意外'(',期待','或';'

在你问我为什么要这样之前......我正在构建一个持久化到数据库的对象的对象层次结构,我希望在类上有一个数组,其中包含所有字段的默认值。我可以通过重复派生类中基类的字段来构建它,但这似乎是多余的(DRY原则)。

也许我只是以错误的方式解决这个问题,所以如果你有更好的想法来解决同样的问题,我会非常感谢你并接受它作为答案。


更新:感谢 doydoy44 ,我找到了一个满意的解决方案:

我在返回合并数组的基类上使用静态函数。它使用一种反射来递归地在层次结构树中调用自身,直到所有数组都已合并为止:

<?php 
   class Base {
      protected static $array = array(
         'test1' => 'Hello',
      );

      public static function getArray() {
         $thisClass = get_called_class();
         $parentClass = get_parent_class($thisClass);
         $exists = method_exists($parentClass, __FUNCTION__); 
         return $exists ? 
            array_merge($parentClass::getArray(), $thisClass::$array) : 
            $thisClass::$array;
      }
   }

   class Derived extends Base {
      protected static $array = array(
         'test2' => 'World!'
   );
}
?>

<ul>    
<?php
   foreach (Base::getArray() as $key => $value) { 
?>      
   <li><?= $key ?> = <?= $value ?></li>
<?php 
   } 
?>
</ul>

<ul>    
<?php
   foreach (Derived::getArray() as $key => $value) { 
?>      
   <li><?= $key ?> = <?= $value ?></li>
<?php 
   } 
?>
</ul>

哪个输出:

<ul>
   <li>test1 = Hello</li>
</ul>

<ul>
   <li>test1 = Hello</li>
   <li>test2 = World!</li>
</ul>

2 个答案:

答案 0 :(得分:1)

不能在构造函数之外为类的变量赋值函数返回值。

替换

 class Derived extends Base {
      public static $array = array_merge(parent::$array, array(
         'test2' => 'World!'
      ));
   }

class Derived extends Base {

    public static $array;
    function __construct()
    {
        self::$array=array_merge(parent::$array, array(
            'test2' => 'World!'
        ));
    }

}

答案 1 :(得分:1)

试试这个:

class Base {
  public static $array = array(
     'test1' => 'Hello',
  );
}

class Derived extends Base {
  public static $array = array(
     'test2' => 'Hello',
  );

  static function getArray(){
    return array_merge(self::$array, parent::$array);
  }
}

并致电

Derived::getArray();