我想这与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]);
}
}
答案 0 :(得分:2)
您需要在offsetGet
内通过引用返回。
虽然直接修改会触发对
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”
我认为需要更多代码吗?