Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Vtoraya_chast_uchebnika_po_WWW_Okonchat_variant...doc
Скачиваний:
31
Добавлен:
27.09.2019
Размер:
6.06 Mб
Скачать

4.3.5. Ссылка в php

Рассматриваемое понятие ссылки отчасти соответствует понятию «указатель» в языке Си, но не является им. Ссылки в PHP - это средство доступа к содержимому одной переменной под разными именами. В PHP имя переменной и её содержимое - это разные вещи, поэтому одно содержимое может иметь разные имена. Существует две разновидности ссылок: жесткие и символические (первые часто называют просто ссылками).

Существует две разновидности ссылок: жесткие и символические (первые часто называют просто ссылками). Жесткие ссылки появились в PHP с версии 4, в третьей версии существовали лишь символические ссылки. Рассмотрим эти ссылки подробнее.

Определение жёсткой ссылки

Жесткая ссылка представляет собой просто переменную, которая является синонимом другой переменной, и не более того. Многоуровневые ссылки, то есть ссылка на ссылку, на переменную (оказывается, есть такие языки, например 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 создастся новый элемент с ключом “с” и значением — пустой строкой (мы можем это определить по результату работы echo). То есть, жесткая ссылка на самом деле не может ссылаться на несуществующий объект, а если делается такая попытка, то объект создается!

Примечание: Если убрать строку, в которой создается жесткая ссылка, то будет выведено сообщение о том, что элемент с ключом “c” не определен в массиве $A.

Жесткие ссылки удобно применять при передаче параметров пользовательской функции и возврате значения из нее.

Создание и примеры использования символической ссылки

Как было определено выше, символическая ссылка – это строковая переменная. Чтобы переменная стала символической ссылкой на другую переменную, ей надо присвоить строковую константу, совпадающую с именем этой переменной (естественно, без знака $). А чтобы добраться до значения переменной, на которую ссылается символическая ссылка, необходимо применить дополнительный знак $ перед именем ссылки.

Рассмотрим пример:

$a=10;

$b=20;

$c=30;

$p="a"; /* или $p="b" или $p="c" (присваиваем $p имя другой переменной)*/

echo $$p; // выводит переменную, на которую ссылается $p, т. е. $a

$$p=100; // присваивает $a значение 100

Дополнительный знак $ перед идентификатором символической ссылки «говорит» интерпретатору, что надо взять не значение самой $p, а значение переменной, имя которой хранится в переменной $p.

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

Удаление ссылок (сброс ссылок)

При удалении ссылки просто разрывается связь между именем и содержимым переменной. Это не означает, что содержимое переменной будет разрушено.

Например:

<?php

$a = 1;

$b =& $a;

unset($a);

?>

Этот код не сбросит $b, а только $a.

Примечание: unset() это конструкция языка. Она разрушает специфицированные переменные. Интересно, что в PHP 3 unset() всегда возвращала TRUE (в действительности - integer значение 1), то есть являлась функцией. Однако в PHP 4 unset() - это больше не true-функция, это теперь оператор. А поскольку никакое значение не возвращается, попытка получить значение unset() даст ошибку разбора.

И все же, жесткая ссылка — не абсолютно точный синоним объекта, на который она ссылается. Дело в том, что оператор unset(), выполненный для жесткой ссылки, не удаляет объект, на который она ссылается, а всего лишь разрывает связь между ссылкой и объектом.

Итак, жесткая ссылка и переменная (объект), на которую она ссылается, абсолютно равноправны, но изменение одной влечет за собой изменение другой.

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