PHP Side Effect. Две ссылки на элемент массива приводят к копированию элемента по ссылке
Invite pending
Долго я ковырялся чтобы найти причину. Сообщения людей что проблема с ссылками в циклах не нашла у меня понимания. И я докопался до кода показывающего side effect.
Суть эффекта — если на элемент в массиве имеется ссылка извне, то при копировании массива этот элемент копируется по ссылке, остальные по значению.
Возможно, side effect находится где-то глубже. Но я мало опыта по кодированию имею, поэтому глубже копать не стал. Код демонстрирующий side-effect ниже:
Костыли на это дело сделать несложно (в большинстве случаев подойдет очистка переменной, в остальных другие способы можно сделать), но чтобы не терять на этом время в поиске ошибки, лучше заранее знать о таком поведении.
Суть эффекта — если на элемент в массиве имеется ссылка извне, то при копировании массива этот элемент копируется по ссылке, остальные по значению.
Возможно, side effect находится где-то глубже. Но я мало опыта по кодированию имею, поэтому глубже копать не стал. Код демонстрирующий side-effect ниже:
<?php
$item1['p1']='p1 before';
$item1['p2']='p2 before';
$link=&$item1['p2'];
$item2=$item1;
$item1['p1']='p1 after';
$item1['p2']='p2 after';
print_r($item2);
// p1 before
// p2 after
Костыли на это дело сделать несложно (в большинстве случаев подойдет очистка переменной, в остальных другие способы можно сделать), но чтобы не терять на этом время в поиске ошибки, лучше заранее знать о таком поведении.