部分覆盖静态成员(数组) - 这可能吗?

时间:2017-01-19 23:56:36

标签: php oop

假设我有一些带静态成员的基类 - 数组:

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。只是为了澄清:我正在使用引擎,它具有所有“功能”。而这些静态成员,甚至可以在静态环境中访问 - 是引擎的一部分,我无法改变。

1 个答案:

答案 0 :(得分:1)

这是默认属性值,在定义属性时不能有任何表达式。因此在定义子类时无法修改数组。

由于它是一个静态属性,你可以在课后添加以下代码,它将在定义类后执行:

class ChildClass extends BaseClass {
    public static $definition;
}

ChildClass::$definition = array_merge(BaseClass::$definition, array(
    'field1' => array(type => 'string', 'required' => false)
));

这不是一个好的方法,但如果你需要的话,它会起作用。