考虑以下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
通知。这是什么一回事呢?
答案 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;