Поскольку объекты уже передаются «по ссылке» в PHP5 +, то, используя &
, вы фактически передаете «ссылку на ссылку на объект», а не просто «ссылку на объект».Это может быть критически важным, потому что это позволит функции в пределах локальной области изменять глобальную фактическую ссылку и потенциально полностью удалять объект.Например, можно подумать, что следующий пример передачи объекта по ref и передачи по «обычному» полностью одинаков:
$aa = new stdclass;
$aa->aa = 1;
byRef($aa);
function byRef(&$aaa) {
$aaa->aa = 2;
}
var_dump($aa); // Outputs {aa:2}
$bb = new stdclass;
$bb->bb = 1;
byVal($bb);
function byVal($bba) {
$bba->bb = 2;
}
var_dump($bb); // Outputs {bb:2}
Судя по выводу, он выглядит одинаково.Но это хорошая практика?Зависит от того, что вы хотели сделать.Посмотрите на тот же пример, где мы уничтожили исходную ссылку и «удалили» объект:
$aa = new stdclass;
$aa->aa = 1;
byRef($aa);
function byRef(&$aaa) {
$aaa->aa = 2;
$aaa = 0; // We are changing $aa, not $aaa, because $aaa is just a reference
}
var_dump($aa); // Outputs int:0, $aa is not an object anymore
$bb = new stdclass;
$bb->bb = 1;
byVal($bb);
function byVal($bba) {
$bba->bb = 2;
$bba = 0;
}
var_dump($bb); // Outputs {bb:0}
Код говорит сам за себя.В некоторых случаях это необходимо, в других это критично.По моему мнению, если вы действительно не знаете, что вы делаете, не переходите по ссылке.