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

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

2.3 Middle🔥 121 комментариев
#PHP Core

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

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

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

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

В PHP массивы передаются в функцию по значению, если явно не указано иное. Это означает, что при вызове функции создаётся копия массива, и все операции внутри функции выполняются над этой копией, не затрагивая исходный массив.

Пример передачи по значению

<?php
function processArray($array) {
    $array[] = 'new_element';
    return $array;
}

$originalArray = [1, 2, 3];
$resultArray = processArray($originalArray);

echo "Original array: ";
print_r($originalArray); // [1, 2, 3]

echo "Result array: ";
print_r($resultArray); // [1, 2, 3, 'new_element']
?>

Ключевые моменты:

  • Функция processArray() получает копию $originalArray.
  • Добавление элемента 'new_element' происходит в копию.
  • Исходный массив $originalArray остаётся неизменным.

Что происходит "под капотом"

PHP использует механизм copy-on-write:

  1. При передаче массива создаётся ссылка на тот же данные в памяти.
  2. Если функция пытается модифицировать массив, только тогда создаётся настоящая копия.
  3. Пока массив не изменяется, обе переменные ссылаются на одни и те же данные.
<?php
// Демонстрация copy-on-write
function checkMemory($array) {
    // До модификации - ссылка на те же данные
    $array[] = 'modified'; // Только здесь создаётся копия
    return $array;
}

$testArray = range(1, 1000); // Большой массив
$result = checkMemory($testArray);
// Память эффективно используется благодаря copy-on-write
?>

Когда массив всё же может измениться

Есть два исключения, когда исходный массив может быть изменён:

1. Передача по ссылке (явная)

<?php
function modifyArrayByReference(&$array) {
    $array[] = 'modified';
}

$myArray = [1, 2, 3];
modifyArrayByReference($myArray);
print_r($myArray); // [1, 2, 3, 'modified'] - исходный массив изменён!
?>

2. Передача объектов (массивы - не объекты)

Важно отметить, что объекты в PHP передаются по ссылке по умолчанию, но это не относится к массивам, так как массивы в PHP - не объекты (хотя в PHP 8+ есть класс ArrayObject).

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

Для безопасной работы с массивами в функциях:

  • Для чтения данных - передавайте массив обычным способом
  • Для модификации с сохранением оригинала - работайте с копией
  • Для модификации оригинала - используйте явную передачу по ссылке &
  • Для возврата модифицированного массива - используйте return
<?php
// Безопасный паттерн работы с массивами
function safeArrayProcessing($inputArray) {
    // Создаём явную копию для работы
    $workingCopy = $inputArray;
    
    // Выполняем операции с копией
    $workingCopy['processed'] = true;
    $workingCopy['timestamp'] = time();
    
    // Возвращаем результат
    return $workingCopy;
}

// Исходные данные защищены от изменений
$sourceData = ['id' => 123, 'name' => 'Test'];
$processedData = safeArrayProcessing($sourceData);
?>

Производительность и большие массивы

При работе с большими массивами стоит учитывать:

  • Передача по значению может потребовать много памяти при модификации
  • Для оптимизации можно передавать по ссылке, если функция только читает данные
  • Альтернатива - использование объектов ArrayObject или SplFixedArray
<?php
// Оптимизация для больших массивов (только чтение)
function analyzeLargeArray(&$largeArray) {
    // Используем & для избежания копирования
    $sum = array_sum($largeArray);
    $count = count($largeArray);
    return ['sum' => $sum, 'count' => $count];
}

$bigData = range(1, 1000000);
$stats = analyzeLargeArray($bigData); // Не создаёт копию массива
?>

Вывод: По умолчанию в PHP массивы передаются в функцию по значению через механизм copy-on-write, что защищает исходные данные от случайных изменений, но обеспечивает эффективное использование памяти до момента реальной модификации данных внутри функции.