Как массив передается в функцию в PHP: по значению или по ссылке?

«Как массив передается в функцию в PHP: по значению или по ссылке?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

По умолчанию массивы в 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 ) - оригинальный массив изменен

Важные нюансы:

  1. Copy-on-write: Даже при передаче по значению физическое копирование данных в памяти происходит не в момент вызова функции, а только при попытке изменить массив внутри функции. Это оптимизация производительности.
  2. Производительность: Передача больших массивов по значению с последующим изменением может быть накладной, так как приводит к их копированию. В таких случаях передача по ссылке (&) или переработка логики (например, возврат нового массива) может быть эффективнее.
  3. Возврат значения: Часто более чистым подходом, чем передача по ссылке, является возврат измененного массива из функции:
    function addItemAndReturn($array): array {
        $array[] = 'new item';
        return $array;
    }
    $myArray = addItemAndReturn($myArray);

    Использование передачи по ссылке (&) оправдано, когда нужно вернуть несколько значений или при работе с очень большими структурами данных, которые необходимо модифицировать на месте.