gpt4 book ai didi

php - 如果项不在数组中,则无法扩展 ArrayObject::offsetGet() 函数以返回 null

转载 作者:搜寻专家 更新时间:2023-10-31 20:38:00 25 4
gpt4 key购买 nike

本来我以为这会是小菜一碟..不适合我..

我正在尝试扩展 offsetGet() 函数以在项目不在 ArrayObject 中时返回 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 -- 中无效 --

最佳答案

简短的回答:这是从 ArrayObject 重载 offsetGet() 方法的一个讨厌的副作用。

$array['something']['foo'] = 'bar';

作为赋值的一部分,ArrayObject::offsetGet('something') 被调用,返回值预计返回一个引用;问题是,尽管定义了 &offsetGet(),但它实际上并没有返回引用。

真正返回的是一个临时变量,因此断言对该变量所做的任何更改都不会反射(reflect)在最终数组中的声明是正确的。

顺便说一句,如果您改为实现ArrayAccess,则不会发生这种情况;当然,您也不会获得 ArrayObject 附带的所有方法 :(

更新

似乎来自this report HHVM 表现出正确的行为并且 PHP 7 不会生成任何通知(但在分配期间有错误的行为)。

关于php - 如果项不在数组中,则无法扩展 ArrayObject::offsetGet() 函数以返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30500769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com