Установка вложенного массива в классе коллекции Laravel

Рассмотрим следующий фрагмент 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 уведомление. О чем это все?

3

Решение

Я знаю, что сталкивался с этой проблемой раньше, и я могу сказать вам, что это не связано с 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;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]