1

我想这与ArrayAccess 有关,因为$this其中的对象$this->products[$key]确实实现了 ArrayAccess。然而,没有魔法__get__set任何地方。

var_dump($this->products[$key]['selected_options'][$option_key]);
// Output: string(7) "Größe:S"

$this->products[$key]['selected_options'][$option_key] = "test";

var_dump($this->products[$key]['selected_options'][$option_key]);
// Output: string(7) "Größe:S"

有人知道这里有什么问题吗?

另请注意,这确实有效:

$this->products[$key]['selected_options'] = array($option_key => "test");
// Output: string(4) "test"

产品的 ArrayAccess 与$this(Cart) 相同,但使用$products而不是$data

class Product implements ArrayAccess
{
    protected $data;

    /* **** ArrayAccess **** */
    public function offsetExists($offset) {
        return isset($this->data[$offset]);
    }

    public function offsetGet($offset) {
        return $this->data[$offset];
    }

    public function offsetSet($offset , $value) {
        $this->data[$offset] = $value;
    }

    public function offsetUnset($offset) {
        unset($this->data[$offset]);
    }
}
4

3 回答 3

2

您需要在内部通过引用返回offsetGet

从手册

直接修改触发调用ArrayAccess::offsetSet(),间接修改触发调用ArrayAccess::offsetGet()。在这种情况下,实现ArrayAccess::offsetGet()必须能够通过引用返回,否则E_NOTICE会引发消息。

但是请注意,这只适用于 PHP >= 5.3.4

于 2013-01-26T13:56:20.743 回答
1

您可能正在尝试更改不可变属性

如何$this->products定义?它的能见度如何?您需要查看当前类的范围,并查看实例化后是否可以覆盖属性。

于 2013-01-26T13:37:37.893 回答
0

好吧,我跑了这个:

// INPUT: string(7) "Größe:S"
$products = array();

$key = 1;
$option_key = 1;

$products[$key]['selected_options'][$option_key] = "badgers";

$products[$key]['selected_options'][$option_key] = "xxx";

var_dump($products[$key]['selected_options'][$option_key]);

输出是:

字符串(3)“xxx”

所以我认为需要更多代码?

于 2013-01-26T13:36:20.663 回答