Pull to refresh

PHP 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

Костыли на это дело сделать несложно (в большинстве случаев подойдет очистка переменной, в остальных другие способы можно сделать), но чтобы не терять на этом время в поиске ошибки, лучше заранее знать о таком поведении.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.