PHP 5.5.12. Рассмотрим это:
<?php
$a = [ 'a', 'b', 'c' ];
foreach($a as &$x) {
$x .= 'q';
}
print_r($a);
Это, как и ожидалось, выходы:
Array
(
[0] => aq
[1] => bq
[2] => cq
)
Теперь рассмотрим:
<?php
$a = [ 'a', 'b', 'c' ];
foreach(z($a) as &$x) {
$x .= 'q';
}
print_r($a);
function z($a)
{
return $a;
}
Выводится:
Array
(
[0] => aq
[1] => bq
[2] => cq
)
(!) Но подождите минуту. $a не передается по ссылке. Это означает, что я должен получить копию обратно из z(), которая будет изменена, а $a следует оставить в покое.
Но что происходит, когда мы заставляем PHP делать свою магию копирования на запись:
$a = [ 'a', 'b', 'c' ];
foreach(z($a) as &$x) {
$x .= 'q';
}
print_r($a);
function z($a)
{
$a[0] .= 'x';
return $a;
}
Для этого получаем то, что я ожидаю:
Array
(
[0] => a
[1] => b
[2] => c
)
EDIT: Еще один пример...
$a = [ 'a', 'b', 'c' ];
$b = z($a);
foreach($b as &$x) {
$x .= 'q';
}
print_r($a);
function z($a)
{
return $a;
}
Это работает как ожидалось:
Array
(
[0] => a
[1] => b
[2] => c
)
Есть ли для этого рациональное объяснение?