Рассмотрим следующий фрагмент 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
уведомление. О чем это все?
Я знаю, что сталкивался с этой проблемой раньше, и я могу сказать вам, что это не связано с 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-х Collection
объект реализует это ArrayAccess
интерфейс, и это позволяет получить доступ к объектам в виде массивов.
Итак, что происходит, когда вы используете []
оператор на этом объекте? offsetGet
метод вызывается и возвращает массив, но не ссылка к этому массиву. Поэтому любые сделанные вами изменения будут внесены в пространство, так как возвращаемый массив не ссылается на фактический массив в объекте. Вы можете понять это больше, посмотрев в ArrayAccess
интерфейс самостоятельно, но что действительно важно, так это решение.
$var = collect(['foo' => []]);
$temp = $var['foo'];
$temp['x'] = 2;
$var['foo'] = $temp;
Других решений пока нет …