最初我以为这将是小菜一碟..不适合我..
如果项目不在 ArrayObject 中,我正在尝试扩展 offsetGet() 函数以返回 null。到目前为止,我似乎无法让它在没有错误的情况下正常工作。
php -v: 5.3.29
我究竟做错了什么?以下是我的代码和错误:
我扩展的 ArrayObject 类:
class IssetArray extends \ArrayObject {
public function &offsetGet($offset) {
$var = $this->offsetExists($offset) ? parent::offsetGet($offset) : null;
return $var;
}
}
我是这样称呼它的:
$array = new \IssetArray();
$array['item'] = 123;
var_dump($array['item']);
var_dump($array['something']['noItem']);
$array['something']['foo'] = 'bar';
var_dump($array['something']['foo']);
$normalArrayObject = new \ArrayObject();
$normalArrayObject['something']['foo'] = 'bar';
var_dump($normalArrayObject['something']['foo']);
var_dump($normalArrayObject['something']['noItem']);
输出:
int(123)
NULL
Notice: Indirect modification of overloaded element of \IssetArray has no effect in -- on line --
NULL
string(3) "bar"
Notice: Undefined index: noItem in -- on line --
NULL
我究竟做错了什么??如果我调用普通的 ArrayObject 我不会得到间接修改错误。在这一点上我很困惑。
任何帮助都会很棒。我用谷歌搜索和搜索,但没有运气。
更新 - - - - - -
当试图用 ArrayAccess 做同样的事情时,我遇到了同样的问题。如何使用 ArrayAccess 解决这个问题?
我的实现:
class IssetArray implements \ArrayAccess {
private $container = array();
public function __construct() {}
public function offsetSet($offset, $value) {
if (is_null($offset)) {
$this->container[] = $value;
} else {
$this->container[$offset] = $value;
}
}
public function offsetExists($offset) {
return isset($this->container[$offset]);
}
public function offsetUnset($offset) {
unset($this->container[$offset]);
}
public function &offsetGet($offset) {
$var = isset($this->container[$offset]) ? $this->container[$offset] : null;
return $var;
}
}
这导致了我在 ArrayObject 中看到的相同问题。注意:\IssetArray 的重载元素的间接修改在 -- on line -- 中没有影响