Допустим, у меня есть некоторый базовый класс со статическим членом — массив:
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. просто чтобы уточнить: я работаю с движком со всеми его «функциями», как есть. И такие статические элементы, к которым даже можно получить доступ в статическом контексте, — это части двигателя, которые я не могу изменить.
Это значение свойства по умолчанию, и вы не можете иметь никаких выражений при определении свойств. Таким образом, нет способа изменить массив при определении дочернего класса.
Поскольку это статическое свойство, вы можете добавить следующий код после класса, и он будет выполнен после определения класса:
class ChildClass extends BaseClass {
public static $definition;
}
ChildClass::$definition = array_merge(BaseClass::$definition, array(
'field1' => array(type => 'string', 'required' => false)
));
Не очень хороший подход, но он работает, если это то, что вам нужно.
Других решений пока нет …