Жесткие ссылки
Жесткая ссылка представляет собой просто переменную, которая является синонимом другой переменной. Многоуровневые ссылки (то есть, ссылка на ссылку на переменную, как это можно делать, например, в Perl) не поддерживаются. Так что, думаю, не стоит воспринимать жесткие ссылки серьезнее, чем синонимы.
Чтобы создать жесткую ссылку, нужно использовать оператор & (амперсанд). Например:
$a=10;
$b = &$a; // òåïåðü $b— òî æå ñàìîå, ÷òî è $a
$b=0; // íà ñàìîì äåëå $a=0
echo "b=$b, a=$a"; // âûâîäèò "b=0, a=0"
Ссылаться можно не только на переменные, но и на элементы массива (этим жесткие ссылки выгодно отличаются от символических). Например:
$A=array('a' => 'aaa', 'b' => 'bbb');
$b=&$A['b']; // òåïåðü $b — òî æå, ÷òî è ýëåìåíò ñ èíäåêñîì 'b' ìàññèâà
$b=0; // íà ñàìîì äåëå $A['b']=0;
echo $A['b']; // âûâîäèò 0
Впрочем, элемент массива, для которого планируется создать символическую ссылку, может и не существовать. Как в следующем случае:
$A=array('a' => 'aaa', 'b' => 'bbb');
$b=&$A['c']; // òåïåðü $b — òî æå, ÷òî è ýëåìåíò ñ èíäåêñîì 'c' ìàññèâà
echo "Ýëåìåíò ñ èíäåêñîì 'c': (".$A['c'].")";
В результате выполнения этой программы, хотя ссылке $b и не было ничего присвоено, в массиве $A создастся новый элемент с ключом c и значением — пустой строкой (мы можем это определить по результату работы echo). То есть, жесткая ссылка на самом деле не может ссылаться на несуществующий объект, а если делается такая попытка, то объект создается.
Попробуйте убрать строку, в которой создается жесткая ссылка, и вы тут же получите сообщение о том, что элемент с ключом c не определен в массиве $A.
И все же, жесткая ссылка — не абсолютно точный синоним объекта, на который она ссылается. Дело в том, что оператор Unset(), выполненный для жесткой ссылки, не удаляет объект, на который она ссылается, а всего лишь разрывает связь между ссылкой и объектом.
В этой трактовке любую переменную, даже только что созданную, можно рассматривать как жесткую ссылку. Просто она — единственная, кто ссылается на недавно построенный объект[В. О.22] .
Итак, жесткая ссылка и переменная (объект), на которую она ссылается, совершенно равноправны, но изменение одной влечет изменение другой. Оператор Unset() разрывает связь между объектом и ссылкой, но объект удаляется только тогда, когда на него никто уже не ссылается.
Жесткие ссылки удобно применять при передаче параметров функции и возврате значения из нее. Как это делается, мы рассмотрим в главе, описывающей возможности создания функций на PHP.