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

Что такое ссылки в PHP и каковы основные операции с их использованием?

2.2 Middle🔥 171 комментариев
#PHP Core

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

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

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

Что такое ссылки в PHP

В PHP ссылка (reference) — это псевдоним (алиас) для существующей переменной, который позволяет обращаться к одному и тому же значению в памяти под разными именами. Ссылки не являются указателями в стиле C/C++ — это скорее дополнительная привязка имени к значению. При работе со ссылками изменение данных через одну переменную автоматически отражается на всех других переменных, ссылающихся на те же данные.

Ключевой принцип: в PHP переменные хранят значения, а ссылки позволяют нескольким переменным "смотреть" на одно значение. До PHP 5 каждая переменная содержала значение напрямую (копировала его). С появлением zval (внутренней структуры данных движка Zend) PHP стал использовать механизм копирования при записи (copy-on-write), а ссылки стали способом обойти это копирование.

Основные операции с использованием ссылок

1. Создание ссылки через оператор &

Оператор & создаёт ссылку на переменную.

$original = 100;
$ref = &$original; // $ref — ссылка на $original

$ref = 200;
echo $original; // 200, так как изменилось общее значение

2. Передача по ссылке в функции

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

function increment(&$value) {
    $value++;
}

$number = 5;
increment($number);
echo $number; // 6

Без & изменение $value внутри функции не затронет $number.

3. Возврат ссылки из функции

Функция может возвращать ссылку, но для этого нужно использовать & и в объявлении функции, и при присваивании результата.

$data = [1, 2, 3];

function &getArrayReference(&$array) {
    return $array;
}

$refArray = &getArrayReference($data);
$refArray[] = 4;
print_r($data); // [1, 2, 3, 4]

Важно: если не поставить & при присваивании $refArray, будет создана копия, а не ссылка.

4. Ссылки в массивах

Элементы массива могут быть ссылками на другие переменные.

$a = 10;
$b = 20;
$array = [&$a, &$b];
$array[0] = 30;
echo $a; // 30, так как $array[0] — ссылка на $a

5. Присваивание по ссылке

Присваивание создаёт связь между переменными.

$x = 'текст';
$y = &$x;
$y = 'новый текст';
echo $x; // 'новый текст'

6. Разрыв ссылки с помощью unset()

unset() удаляет связь переменной со значением, но не само значение, если на него есть другие ссылки.

$var1 = 'значение';
$var2 = &$var1;
unset($var2);
echo $var1; // 'значение' — всё ещё существует

Важные нюансы работы со ссылками

  • Производительность. Ссылки могут ускорить код, избегая копирования больших данных (массивов, объектов), но чрезмерное использование усложняет отладку.
  • Объекты. В PHP 5+ объекты по умолчанию передаются по ссылке-подобию (object reference). Явное использование & часто избыточно:
class Example {}
$obj1 = new Example();
$obj2 = $obj1; // $obj2 ссылается на тот же объект, копирования нет
  • Циклы с ссылками. Полезны для модификации элементов массива:
$numbers = [1, 2, 3];
foreach ($numbers as &$value) {
    $value *= 2;
}
print_r($numbers); // [2, 4, 6]

Осторожно: после такого цикла $value остаётся ссылкой на последний элемент, что может привести к случайным изменениям.

  • Сравнение ссылок. Оператор == сравнивает значения, а === — ещё и тип, но для проверки, являются ли две переменные ссылкой на одно значение, нужно сравнивать сами переменные после изменений.

Заключение

Ссылки в PHP — мощный, но требующий аккуратности инструмент. Они полезны для:

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

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