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

Как будет передан массив внутри функции по ссылке?

2.0 Middle🔥 191 комментариев
#PHP Core

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

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

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

Передача массива по ссылке в PHP

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

Основной механизм передачи по ссылке

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

<?php
// Функция с передачей параметра по ссылке
function modifyArrayByReference(&$array) {
    $array[] = 'new element';
    $array['key'] = 'value';
}

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

// Оригинальный массив изменён
print_r($originalArray);
?>

Вывод:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => new element
    [key] => value
)

Ключевые особенности передачи массивов по ссылке

  1. Эффективность при работе с большими массивами: При передаче по ссылке не создаётся копия массива, что экономит память и повышает производительность, особенно для массивов с большим количеством элементов.

  2. Изменения сохраняются: Все модификации массива внутри функции отражаются на оригинальном массиве после вызова функции.

  3. Явное указание: Необходимо явно указать & в объявлении параметра функции.

Сравнение передачи по значению и по ссылке

<?php
// Передача по значению (по умолчанию)
function modifyByValue($arr) {
    $arr[] = 'modified';
    return $arr;
}

// Передача по ссылке
function modifyByReference(&$arr) {
    $arr[] = 'modified';
}

$testArray = ['original'];

// По значению - исходный массив не изменяется
$result = modifyByValue($testArray);
echo "По значению - исходный массив: ";
print_r($testArray); // Остаётся ['original']

// По ссылке - исходный массив изменяется
modifyByReference($testArray);
echo "По ссылке - исходный массив: ";
print_r($testArray); // Становится ['original', 'modified']
?>

Важные нюансы и рекомендации

  1. Возврат ссылки из функции: Можно не только принимать параметры по ссылке, но и возвращать ссылки из функций:
<?php
function &getArrayReference() {
    static $array = [];
    return $array;
}

$ref = &getArrayReference();
$ref[] = 'data';
?>
  1. Передача по ссылке в современных версиях PHP: Начиная с PHP 5.4+, передача по ссылке при вызове функции (в месте вызова) устарела. Раньше можно было делать так: myFunction(&$array), но сейчас это вызывает ошибку. Ссылка указывается только в объявлении функции.

  2. Работа с объектами: Объекты всегда передаются по ссылке по умолчанию (фактически передаётся указатель на объект), поэтому для объектов оператор & обычно не требуется.

Практический пример использования

<?php
// Функция для фильтрации массива по ссылке
function filterPositiveNumbers(&$numbers) {
    foreach ($numbers as $key => $value) {
        if ($value <= 0) {
            unset($numbers[$key]);
        }
    }
    // Переиндексация массива
    $numbers = array_values($numbers);
}

$data = [5, -3, 10, 0, 7, -1];
filterPositiveNumbers($data);

// $data теперь содержит только положительные числа
print_r($data); // [5, 10, 7]
?>

Когда использовать передачу по ссылке

  • Оптимизация производительности: Для больших массивов, когда нежелательно создавать копии
  • Модификация исходных данных: Когда функция должна изменить переданный массив
  • Работа с глобальными или внешними данными: Когда нужно модифицировать массив, определённый вне функции

Когда избегать передачи по ссылке

  • Принцип наименьшего удивления: Если функция неявно изменяет входные параметры, это может запутать других разработчиков
  • Тестирование: Функции с побочными эффектами сложнее тестировать
  • Чистые функции: Для функций, которые должны быть идемпотентными и не иметь побочных эффектов

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