我喜欢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);
Run Code Online (Sandbox Code Playgroud)
第二个断言将失败.单步执行代码表明调用了offsetGet并执行了if子句.然而,任何数组值都为null.任何替代实施的想法?
我厌倦了写作
if(!isset($myarr['value']))
$myarr['value'] = new MyObj();
$myarr['value']->myVal=5;
Run Code Online (Sandbox Code Playgroud)
而不仅仅是写作
$myarr['value']->myVal=5;
Run Code Online (Sandbox Code Playgroud)
$da->setDefault(1);
Run Code Online (Sandbox Code Playgroud)
您还可以使用__construct魔术功能:
class DefaultArray extends ArrayObject
{
public function __construct($value = null){
if(is_null($value))
{
$this->value = 'default';
} else {
$this->value = $value;
}
}
}
Run Code Online (Sandbox Code Playgroud)