← Назад к вопросам

Что будет на выходе при передаче и модифицировании массива в функцию?

1.0 Junior🔥 61 комментариев
#PHP Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Поведение массивов при передаче в функцию в PHP

Краткий ответ: При передаче массива в функцию в PHP по умолчанию он передаётся по значению (by value). Это означает, что создаётся копия массива, и все изменения внутри функции не затрагивают исходный массив, если не используется явное присвоение по ссылке.

Ключевой механизм передачи аргументов

В PHP существует два основных способа передачи переменных в функцию:

  1. Передача по значению (по умолчанию) – функция получает копию переменной.
  2. Передача по ссылке – функция работает непосредственно с оригинальной переменной, используя оператор &.

Примеры и объяснение

Пример 1: Передача по значению (стандартное поведение)

<?php

function modifyArray($array) {
    $array[] = "new_element";
    $array[0] = "modified";
    return $array;
}

$original = [1, 2, 3];
$result = modifyArray($original);

echo "Исходный массив: ";
print_r($original);
echo "Массив после функции: ";
print_r($result);

?>

Вывод:

Исходный массив: Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
Массив после функции: Array
(
    [0] => modified
    [1] => 2
    [2] => 3
    [3] => new_element
)

Что происходит?

  • В функцию передаётся копия массива $original
  • Все изменения применяются только к этой копии
  • Исходный массив остаётся неизменным
  • Чтобы сохранить изменения, нужно вернуть массив через return

Пример 2: Передача по ссылке

<?php

function modifyArrayByReference(&$array) {
    $array[] = "new_element";
    $array[0] = "modified";
}

$original = [1, 2, 3];
modifyArrayByReference($original);

echo "Исходный массив после функции с ссылкой: ";
print_r($original);

?>

Вывод:

Исходный массив после функции с ссылкой: Array
(
    [0] => modified
    [1] => 2
    [2] => 3
    [3] => new_element
)

Что происходит?

  • Переменная $array в функции является ссылкой на оригинальный массив $original
  • Все изменения применяются непосредственно к исходному массиву
  • Не требуется возвращать значение через return для сохранения изменений

Важные нюансы и оптимизации

Copy-on-Write (Копирование при записи)

PHP использует механизм copy-on-write для оптимизации работы с массивами:

  • При передаче массива в функцию не создаётся полная физическая копия сразу
  • Копия создаётся только при попытке изменения массива внутри функции
  • До момента модификации обе переменные ссылаются на одни и те же данные в памяти
<?php
// До изменения - одна копия в памяти
function checkMemory($arr) {
    // $arr и $original ссылаются на одни данные
    $arr[] = "change"; // Только здесь создаётся копия
}
?>

Возврат модифицированного массива

На практике чаще используется возврат массива через return, а не передача по ссылке:

<?php
function processData(array $data): array {
    // Множество операций с данными
    $data['processed'] = true;
    $data['timestamp'] = time();
    
    return $data; // Возвращаем модифицированную копию
}

$sourceData = ['id' => 1, 'name' => 'Test'];
$processedData = processData($sourceData);
?>

Практические рекомендации

  1. Используйте type hints для ясности:

    function processItems(array $items): array
    
  2. Избегайте неявной передачи по ссылке – это может приводить к неочевидным сайд-эффектам

  3. Для больших массивов передача по ссылке может быть эффективнее по памяти, но усложняет понимание кода

  4. В современном PHP (7.4+) для обработки больших данных рассмотрите использование объектов, которые по умолчанию передаются по ссылке

Вывод

По умолчанию в PHP массив передаётся в функцию по значению, и изменения внутри функции не влияют на оригинальный массив. Для изменения оригинала необходимо либо использовать передачу по ссылке (с оператором &), либо возвращать модифицированную копию через return. Выбор подхода зависит от конкретной задачи, требований к производительности и соглашений в проекте.

Что будет на выходе при передаче и модифицировании массива в функцию? | PrepBro