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

В чём разница между передачей по значению и по ссылке?

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

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

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

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

Разница между передачей по значению и по ссылке в PHP

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

Передача по значению (Pass by Value)

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

Ключевые характеристики:

  • Создается отдельная копия данных.
  • Оригинальная переменная остается неизменной после вызова функции.
  • Это стандартный и наиболее безопасный способ передачи аргументов в PHP.
  • Используется для большинства типов данных.

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

function incrementByValue($number) {
    $number += 10;
    return $number;
}

$originalNumber = 5;
$result = incrementByValue($originalNumber);

echo "Original: $originalNumber\n"; // Вывод: Original: 5
echo "Result: $result\n";           // Вывод: Result: 15

В этом примере $originalNumber передается в функцию incrementByValue. Внутри функции работает копия этого значения, поэтому оригинальная переменная $originalNumber остается равной 5.

Передача по ссылке (Pass by Reference)

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

Ключевые характеристики:

  • Передается ссылка на оригинальную переменную.
  • Изменения внутри функции отражаются на исходной переменной.
  • В PHP для передачи по ссылке используется символ & перед именем параметра в объявлении функции и/или перед аргументом при вызове (в зависимости от версии PHP).
  • Особенно полезен для работы с большими структурами данных (например, массивами или объектами) без создания копий, что может экономить память.

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

function incrementByReference(&$number) {
    $number += 10;
}

$originalNumber = 5;
incrementByReference($originalNumber);

echo "Original after function: $originalNumber\n"; // Вывод: Original after function: 15

Здесь $originalNumber передается по ссылке благодаря & в определении параметра функции. После вызова функции значение $originalNumber изменяется на 15.

Особенности передачи объектов и массивов в PHP

В PHP объекты всегда передаются по ссылке, даже без явного использования &. Это связано с тем, что переменная объекта содержит ссылку на экземпляр, а не сам объект. Однако формально это называется "передача объекта по значению ссылки".

class User {
    public $name;
}

function changeName($user) {
    $user->name = "Alice";
}

$originalUser = new User();
$originalUser->name = "Bob";
changeName($originalUser);

echo $originalUser->name; // Вывод: Alice

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

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

  • Безопасность: Передача по значению обычно безопаснее, поскольку предотвращает случайное изменение исходных данных.
  • Эффективность: Передача по ссылке может быть более эффективной для больших структур данных, избегая копирования.
  • Явность: В современном PHP (5.3+) передача по ссылке при вызове функции с & перед аргументом считается устаревшей практикой. Рекомендуется использовать только & в объявлении параметра функции.

Сравнение в таблице

КритерийПередача по значениюПередача по ссылке
Что передаетсяКопия значенияСсылка на оригинальную переменную
Влияние на оригиналНет измененийИзменяется напрямую
Синтаксис в PHPСтандартный параметрПараметр с & (function foo(&$param))
ПрименениеБольшинство случаев, безопасностьЭффективная работа с большими данными, модификация оригинала

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

В чём разница между передачей по значению и по ссылке? | PrepBro