|
изы.
Ссылочные переменные
Хотя в PHP нет такого понятия, как указатель (что, возможно, к лучшему, а
скорее
всего — нет), все же можно создавать ссылки на другие переменные. Существует
две
разновидности ссылок: жесткие и символические (первые часто называют просто
ссылками). Жесткие ссылки появились лишь в PHP версии 4 (в третьей версии суще-
ствовали лишь символические ссылки).
Жесткие ссылки
Жесткая ссылка представляет собой просто переменную, которая является синонимом
другой переменной. Многоуровневые ссылки (то есть, ссылка на ссылку на перемен-
ную, как это можно делать, например, в Perl) не поддерживаются. Так что, думаю,
не
стоит воспринимать жесткие ссылки серьезнее, чем синонимы.
Чтобы создать жесткую ссылку, нужно использовать оператор & (амперсанд). Напри-
мер:
$a=10;
$b = &$a; // теперь $b — то же самое, что и $a
$b=0; // на самом деле $a=0
echo "b=$b, a=$a"; // auaiaeo "b=0, a=0"
Глава 7. Переменные, константы, выражения 125
Ссылаться можно не только на переменные, но и на элементы массива (этим жесткие
ссылки выгодно отличаются от символических). Например:
$A=array('a' => 'aaa', 'b' => 'bbb');
$b=&$A['b']; // теперь $b — то же, что и элемент с индексом 'b' массива
$b=0; // на самом деле $A['b']=0;
echo $A['b']; // auaiaeo 0
Впрочем, элемент массива, для которого планируется создать символическую ссылку,
может и не существовать. Как в следующем случае:
$A=array('a' => 'aaa', 'b' => 'bbb');
$b=&$A['c']; // теперь $b — то же, что и элемент с индексом 'c' массива
echo "Элемент с индексом 'c': (".$A['c'].")";
В результате выполнения этой программы, хотя ссылке $b и не было ничего
присвое-
но, в массиве $A создастся новый элемент с ключом c и значением — пустой
строкой
(мы можем это определить по результату работы echo). То есть, жесткая ссылка на
самом деле не может ссылаться на несуществующий объект, а если делается такая
попытка, то объект создается.
Попробуйте убрать строку, в которой создается жесткая ссылка, и вы тут же
получите сообщение о том, что элемент с ключом c не определен в массиве
$A.
И все же, жесткая ссылка — не абсолютно точный синоним объекта, на который она
ссылается. Дело в том, что оператор Unset(), выполненный для жесткой ссылки, не
удаляет объект, на который она ссылается, а всего лишь разрывает связь между
ссыл-
кой и объектом.
В этой трактовке любую переменную, даже только что созданную, можно рас-
сматривать как жесткую ссылку. Просто она — единственная, кто ссылается на
недавно построенный объект.
Итак, жесткая ссылка и переменная (объект), на которую она ссылается,
совершенно
равноправны, но изменение одной влечет изменение другой. Оператор Unset() раз-
рывает связь между объектом и ссылкой, но объект удаляется только тогда, когда
на
него никто уже не ссылается.
Жесткие ссылки удобно применять при передаче параметров функции и возврате зна-
чения из нее. Как это делается, мы рассмотрим в главе, описывающей возможности
создания функций на PHP.
Часть III. Основы языка PHP 126
Символические ссылки
Символическая ссылка — это всего лишь строковая переменная, хранящая имя дру-
гой переменной. Чтобы добраться до значения переменной, на которую ссылается
символическая ссылка, необходимо применить оператор разыменования — дополни-
тельный знак $ перед именем ссылки. Давайте разберем пример:
$a=10;
$b=20;
$c=30;
$p="a"; // или $p="b" или $p="c" (присваиваем $p имя другой переменной)
echo $$p; // выводит переменную, на которую ссылается $p, т. е. $a
$$p=100; // присваивает $a значение 100
Мы видим, что для того, чтобы использовать обычную строковую переменную как
ссылку, нужно перед
|
|