Частично переопределить статический член (массив) — это возможно?

Допустим, у меня есть некоторый базовый класс со статическим членом — массив:

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
);
}

Затем я создаю дочерний класс и хочу переопределить этот статический массив, НО мне нужно изменить только один элемент массива. Есть ли способ не копировать и вставлять целые «более 8000» элементов только ради одного измененного элемента?

Другими словами, я не хочу этого

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;
}

Есть ли способ?

Заранее спасибо.

Постскриптум этот член может быть доступен в статическом контексте ( ChildClass::$definition['field1']; ), поэтому этого недостаточно для применения изменений в конструкторе;

P.P.S. просто чтобы уточнить: я работаю с движком со всеми его «функциями», как есть. И такие статические элементы, к которым даже можно получить доступ в статическом контексте, — это части двигателя, которые я не могу изменить.

0

Решение

Это значение свойства по умолчанию, и вы не можете иметь никаких выражений при определении свойств. Таким образом, нет способа изменить массив при определении дочернего класса.

Поскольку это статическое свойство, вы можете добавить следующий код после класса, и он будет выполнен после определения класса:

class ChildClass extends BaseClass {
public static $definition;
}

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

Не очень хороший подход, но он работает, если это то, что вам нужно.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector