【发布时间】:2010-11-30 11:18:56
【问题描述】:
我喜欢 Ruby 的 Hash 实现,您可以在其中使用默认值初始化 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;
【问题讨论】:
-
当访问一个不存在的键时,
offsetGet会将该键设置为默认值(参见offsetSet)。这意味着下一次它会存在。如果您不希望这种行为并且始终获取不存在键的当前默认值,请删除offsetSet调用。 -
感谢 Gumbo 的重要澄清,这种行为在我的第一次测试中让我感到困惑,但这是预期的行为。现在已经回答了问题,我将保留错误的测试代码。