我喜欢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子句。然而,任何数组值都为null。任何替代实施的想法?
我厌倦了写作
if(!isset($myarr['value']))
$myarr['value'] = new MyObj();
$myarr['value']->myVal=5;
而不仅仅是写作
$myarr['value']->myVal=5;
答案 0 :(得分:6)
$da->setDefault(1);
您还可以使用__construct魔术功能:
class DefaultArray extends ArrayObject
{
public function __construct($value = null){
if(is_null($value))
{
$this->value = 'default';
} else {
$this->value = $value;
}
}
}
答案 1 :(得分:3)
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);
答案 2 :(得分:0)
在这种情况下,您可以使用我的小型库ValueResolver,例如:
class DefaultArray extends ArrayObject
{
public function __construct($value = null){
$this->value = ValueResolver::resolve($value, 'default'); // returns 'default' if $value is null
}
}
并且不要忘记使用命名空间use LapaLabs\ValueResolver\Resolver\ValueResolver;
还可以进行类型转换,例如,如果您的变量的值应该是integer
,那么请使用:
$id = ValueResolver::toInteger('6 apples', 1); // returns 6
$id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value)
查看docs了解更多示例
答案 3 :(得分:-3)
为什么这么复杂?
function initVal($value) {
global $myarr;
if(!isset($myarr['value']))
$myarr['value'] = new MyObj();
}
现在你只需要打电话:
initVal('bla');
$myarr['bla']->bla = 'bla';
但是我知道,你的更加整洁。