Мне нравится реализация Hash в Ruby, где вы можете инициализировать объект Hash значением по умолчанию. В данный момент я борюсь с реализацией подобного объекта в PHP. Это мой первый (нерабочий) выстрел в этом.
class DefaultArray extends ArrayObject {
protected $_defaultValue;
public function setDefault($defaultValue) {
$this->_defaultValue = $defaultValue;
}
public function offsetExists($index) {
return true;
}
public function offsetGet($index) {
if(!parent::offsetExists($index)) {
if(is_object($this->_defaultValue))
$default = clone $this->_defaultValue;
else
$default = $this->_defaultValue;
parent::offsetSet($index, $default);
}
return parent::offsetGet($index);
}
}
$da = new DefaultArray();
assert($da["dummy"] == null);
$da->setDefault = 1;
assert($da["dummy2"] == 1);
Второе утверждение не будет выполнено. Пошаговое выполнение кода показывает, что вызывается offsetGet и выполняется условие if. Тем не менее, любое значение массива равно нулю. Есть идеи для альтернативных реализаций?
Я устал писать
if(!isset($myarr['value']))
$myarr['value'] = new MyObj();
$myarr['value']->myVal=5;
вместо того, чтобы просто писать
$myarr['value']->myVal=5;