Ответ
По умолчанию массивы в PHP передаются в функцию по значению (copy-on-write). Это означает, что внутри функции создается копия массива, и изменения этой копии не затрагивают оригинальный массив.
Пример передачи по значению:
function addItem($array) {
$array[] = 'new item'; // Работает с копией
echo 'Inside function: ';
print_r($array); // Выведет: Array ( [0] => new item )
}
$myArray = [];
addItem($myArray);
echo 'Outside function: ';
print_r($myArray); // Выведет: Array ( ) - оригинальный массив НЕ изменился
Для передачи по ссылке используется амперсанд (&) в объявлении параметра:
function addItemByReference(&$array) { // Обратите внимание на &
$array[] = 'new item'; // Работает с оригинальным массивом
}
$myArray = [];
addItemByReference($myArray);
print_r($myArray); // Выведет: Array ( [0] => new item ) - оригинальный массив изменен
Важные нюансы:
- Copy-on-write: Даже при передаче по значению физическое копирование данных в памяти происходит не в момент вызова функции, а только при попытке изменить массив внутри функции. Это оптимизация производительности.
- Производительность: Передача больших массивов по значению с последующим изменением может быть накладной, так как приводит к их копированию. В таких случаях передача по ссылке (
&) или переработка логики (например, возврат нового массива) может быть эффективнее. - Возврат значения: Часто более чистым подходом, чем передача по ссылке, является возврат измененного массива из функции:
function addItemAndReturn($array): array { $array[] = 'new item'; return $array; } $myArray = addItemAndReturn($myArray);Использование передачи по ссылке (
&) оправдано, когда нужно вернуть несколько значений или при работе с очень большими структурами данных, которые необходимо модифицировать на месте.