Посилання - друге ім'я для тієї самої змінної. Зміна через одне ім'я видна через інше.
$a = 1;
$b = &$a;
$b = 2;
echo $a; // 2
Де трапляються посилання:
- Передача в функцію за посиланням - функція змінює змінну викликача:
function addTax(array &$order): void
{
$order['total'] *= 1.2;
}
foreachза посиланням - зміна елементів масиву на місці:
foreach ($prices as &$price) {
$price = round($price, 2);
}
unset($price); // обов'язково!
Пастка з foreach: після циклу $price лишається посиланням на останній елемент. Наступний foreach ($prices as $price) (вже без &) запише в нього кожне значення по черзі - і останній елемент масиву стане копією передостаннього. Тому після циклу за посиланням - unset().
Чого посилання НЕ дають - економії пам'яті. Масиви й рядки в PHP копіюються ліниво (copy-on-write): передача у функцію за значенням не копіює дані, поки їх не змінять. «Передати за посиланням, щоб було швидше» нічого не прискорює, а інколи навпаки змушує PHP розділити масив.
Об'єкти й так передаються «за ідентифікатором»: функція, що отримала об'єкт, змінює той самий об'єкт. & для об'єктів потрібен лише щоб замінити саму змінну на інший об'єкт.
Порада: у сучасному коді посилання - рідкість. Зрозуміліше повернути нове значення ($order = addTax($order)) чи використати array_map, ніж змінювати аргументи непомітно для читача.