在Laravel集合类中设置嵌套数组

时间:2015-09-11 23:15:31

标签: php laravel overloading

考虑以下Laravel片段:

$var = collect(['foo' => []]);
$var['foo']['x'] = 2;

引起Notice: Indirect modification of overloaded element of Illuminate\Support\Collection has no effect in C:/…/file.php通知。这是什么一回事呢?

1 个答案:

答案 0 :(得分:2)

我知道我之前遇到过这个问题,我可以告诉你这与Laravel没有关系。此问题适用于任何实现PHP的ArrayAccess接口的类。让我解释一下。

如果您查看PHP的ArrayAccess界面,您将看到以下方法:

abstract public mixed offsetGet ( mixed $offset )

其中,此方法的常见定义如下:

public function offsetGet($offset) {
    return isset($this->container[$offset]) ? $this->container[$offset] : null;
}

Laravel's Collection object实现了这个ArrayAccess接口,它允许您以数组的形式访问对象。

那么,当您在此对象上使用[]运算符时会发生什么?调用offsetGet方法,它返回一个数组,但不返回该数组的引用。因此,您所做的任何更改都将被放入空间,因为返回的数组不会引用对象中的实际数组。您可以通过自己查看ArrayAccess界面来了解这一点,但真正重要的是解决方案。

$var = collect(['foo' => []]);

$temp = $var['foo'];
$temp['x'] = 2;

$var['foo'] = $temp;