数组值不会更改


Array value does not change

我想这与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 for Products 与$this(购物车)相同,但使用 $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]);
    }
}

您需要在 offsetGet 中通过引用返回。

从手册:

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

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

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

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

好吧,我运行了这个:

// 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"

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