Для начала я понимаю программирование и объекты, но следующее не имеет большого смысла для меня в PHP.
В PHP мы используем оператор and для получения ссылки на переменную. Я понимаю ссылку как способ ссылаться на ту же "вещь" с другой переменной. Если я скажу, например,
$b = 1;
$a =& $b;
$a = 3;
echo $b;
выведет 3, потому что изменения, сделанные в $a, совпадают с изменениями, внесенными в $b. И наоборот:
$b = 1;
$a = $b;
$a = 3;
echo $b;
должен выводить 1.
Если это так, почему нужно ключевое слово clone? Мне кажется, что если я установил
$obj_a = $obj_b
, то изменения, сделанные в $obj_a, не должны влиять на $obj_b,
обратно $obj_a = & $obj_b должен указывать на один и тот же объект, поэтому изменения, сделанные в $obj_a, влияют на $obj_b.
Однако на PHP кажется, что некоторые операции над $obj_a DO влияют на $obj_b, даже если они назначены без ссылочного оператора ($obj_a = $obj_b)
. Это вызвало разочаровывающую проблему для меня сегодня при работе с объектами DateTime, которые я в конечном итоге исправил, выполнив в основном:
$obj_a = clone $obj_b
Но большая часть кода PHP, который я пишу, похоже, не требует явного клонирования, как в этом случае, и отлично работает без него. Что здесь происходит? И почему PHP должен быть таким неуклюжим?