数组值不会更改

时间:2013-01-26 13:26:13

标签: php arrays

我想这与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"

适用于$this(购物车)的产品的ArrayAccess,但$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]);
    }
}

3 个答案:

答案 0 :(得分:2)

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

From the manual

  

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

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

答案 1 :(得分:1)

您可能正在尝试更改an immutable property

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

答案 2 :(得分: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]);

输出结果为:

  

string(3)“xxx”

我认为需要更多代码吗?