更新:解决了!请参阅下文,了解我最终做了什么。谢谢大家,我喜欢这样!
这是一个技术问题,对不起,我还在学习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>
答案 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();