Можно попробовать библиотеку Boost Tokenizer, в особенности Оставленный Разделитель элементов списка
$da->setDefault(1);
Вы также можете использовать волшебную функцию __construct:
class DefaultArray extends ArrayObject
{
public function __construct($value = null){
if(is_null($value))
{
$this->value = 'default';
} else {
$this->value = $value;
}
}
}
Почему так сложно?
function initVal($value) {
global $myarr;
if(!isset($myarr['value']))
$myarr['value'] = new MyObj();
}
Теперь вам просто нужно позвонить:
initVal('bla');
$myarr['bla']->bla = 'bla';
Но, как я вижу, ваш гораздо аккуратнее.
Попробуйте магические методы __ get
.
class DefaultArray extends ArrayObject {
protected $_defaultValue;
public function setDefault($defaultValue) {
$this->_defaultValue = $defaultValue;
}
public function __get($index) {
return $this->offsetGet($index);
}
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['foo'] == null);
$da->setDefault(1);
assert($da['bar'] == 1);