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

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

Ответ

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

Передача по значению — значение переменной копируется. Изменения внутри функции не затрагивают оригинальную переменную.

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

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

echo $original; // 5 (не изменилась)
echo $result;   // 15

Передача по ссылке — в функцию передается ссылка на оригинальную переменную (с помощью &). Изменения внутри функции влияют на оригинал.

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

$original = 5;
incrementByReference($original);

echo $original; // 15 (изменилась напрямую)

Важные особенности PHP:

  • Объекты передаются по ссылке на объект по умолчанию (начиная с PHP 5). Это означает, что копируется лишь указатель (хэндл) на объект, а не сам объект.
  • Массивы и скалярные типы (int, string, bool и т.д.) передаются по значению.
  • Оптимизация: Передача больших массивов по ссылке может сэкономить память, так как не создается полная копия. Однако с появлением механизма copy-on-write в PHP эта разница стала менее критичной для многих сценариев.