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

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

Ответ

В PHP аргументы, включая массивы, по умолчанию передаются по значению (copy-on-write). Это означает, что при вызове функции создается копия переменной, но физическое копирование данных в памяти происходит только в момент попытки их изменения (write).

Если массив внутри функции только читается, механизм copy-on-write предотвращает лишнее копирование, и передача происходит практически без накладных расходов.

Пример:

function calculateTotal(array $items): float
{
    $total = 0.0;
    // Массив $items только читается
    foreach ($items as $item) {
        $total += $item['price'] * $item['quantity'];
    }
    return $total;
}

$cart = [
    ['name' => 'Book', 'price' => 10, 'quantity' => 2],
    ['name' => 'Pen', 'price' => 1, 'quantity' => 5],
];

$sum = calculateTotal($cart); // Массив передан по значению, но копирования не происходит

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