假设我有一些带静态成员的基类 - 数组:
class BaseClass {
public static $definition = array(
'id' => array(type => 'int', 'required' => true),
'field1' => array(type => 'string', 'required' => true),
'field2' => array(type => 'bool', 'required' => true),
// and over8000 array items
);
}
然后我创建子类,我想覆盖这个静态数组,但我只需要改变一个数组项。有没有办法不复制粘贴整个“over8000”项目只为一个更改的项目?
换句话说,我不想要这个
class ChildClass extends BaseClass {
public static $definition = array(
'id' => array(type => 'int', 'required' => true),
'field1' => array(type => 'string', 'required' => false), // the only changed one
'field2' => array(type => 'bool', 'required' => true),
// and over8000 unchanged
);
}
但更紧凑的东西,像这样:
class ChildClass extends BaseClass {
// yes I know this is invalid, lets call this a "pseudocode"
public static $definition['field1']['required'] = true;
}
有办法吗?
提前致谢。
P.S。这个成员可以在静态上下文中访问(ChildClass::$definition['field1'];
),所以这还不足以在构造函数中应用更改;
P.P.S。只是为了澄清:我正在使用引擎,它具有所有“功能”。而这些静态成员,甚至可以在静态环境中访问 - 是引擎的一部分,我无法改变。
答案 0 :(得分:1)
这是默认属性值,在定义属性时不能有任何表达式。因此在定义子类时无法修改数组。
由于它是一个静态属性,你可以在课后添加以下代码,它将在定义类后执行:
class ChildClass extends BaseClass {
public static $definition;
}
ChildClass::$definition = array_merge(BaseClass::$definition, array(
'field1' => array(type => 'string', 'required' => false)
));
这不是一个好的方法,但如果你需要的话,它会起作用。