2. Ссылочные переменые

Жесткие ссылки

пример 1:

$а = 10;
$Ь =& $а; // теперь $b — то же самое, что и $а
$Ь = 0; //на самом деле $а=0
echo "b=$b, a=$a"; // выводит "Ь=0, а=0"

пример 2:

$А = array(
'ресторан' => 'Китайский сюрприз',
'девиз' => 'Nosce te computerus.'
);
$r =& $A['ресторан']; // $r — то же, что и элемент с индексом 'ресторан'
$г = "Восход луны"; // на самом деле $А['ресторан'] = "Восход луны";
echo $А['ресторан']; // выводит "Восход луны"

если в массиве нет  индекса на который ссылаемся данная переменная то  создаётся индекс  и присваивает значение то которое мы хотим.

Символические ссылки
Пример:

$right = "красная";
$wrong = "синяя";

$color = "right";
echo $$color; // выводит значение переменной $right ("красная")
$$color = "несиняя"; // присваивает переменной $right новое значение

Ссылки на объекты:

<?php ## Ссылки на объекты.
// Объявляем новый класс.
class AgentSmith {}
// Создаем новый объект класса AgentSmith.
$first = new AgentSmith ();
// Присваиваем значение атрибуту класса.
$first->mind = 0.123;
// Копируем объекты.
$second = $first;
// Изменяем "разумность" у копии!
$second->mind = 100;
// Выводим оба значения.
echo "First mind: {$first->mind}, second: {$second->mind}";

?>

Данная программа при запуске на интерпретаторе РНР 4 (обращаем еще раз ваше внимание на четвертую версию!) выведет два разных числа: 0.123 и 100, т. к.  объекты $first и $second полностью индивидуальны и не имеют друг с другом ничего общего (во всяком случае, с точки зрения хранимых в них данных). Так происходит потому, что в РНР 4 переменные всегда хранят сами объекты, а не ссылки на них; следовательно, присваивание одной переменной другой ведет к копированию  данных объектов.
Запустив тот же самый код в РНР 5, мы убедимся, что выводимые числа — одни и те же: 100 и 100. Почему так происходит? Дело в том, что в РНР 5 переменная  хранит не сам объект, а лишь ссылку на него.

Попробуйте в программе написать:
echo $first;
Вы увидите что-то вроде «Object id #1и (и предупреждение о том, что нельзя  преобразовывать объекты в строки). Это и есть ссылка на объект с номером 1. То же  самое будет напечатано и при попытке вывести значение «переменной $second: ведь переменные ссылаются на один и тот же объект.
Так как переменные содержат лишь ссылки на объекты, при их присваивании  копируются только эти ссылки, но не сами объекты. Это довольно просто понять: вы можете сдать в гардероб свое пальто (объект) и получить на него номерок (ссылка), а затем пойти к Мастеру Номерков и сделать дубликат. У вас будет два номерка, но пальто, конечно, останется в единственном экземпляре, так что вам не удастся  сколотить состояния на данной махинации, сколько бы вы ее ни проделыва
ли.

Комментарии закрыты

Другие статьи рубрики "1.Переменные, константы, типы данных"