Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

9.2. Операция получения адреса

Как известно, адрес есть у каждого объекта. Это, в частности, подразумевает возможность создания псевдонимов (aliases) для существующих объектов. Операция получения адреса незаменима во многих аспектах РНР. Для объяснения реализации этой операции рассмотрим программу:

<?php

$name = 'Sasha';

$secondname = &$name;

$secondname = "My name is $secondname";

$secondname = "I hope $secondname ";

echo $name;

echo $secondname;

?>

Опишем работу данного скрипта. Переменной $name задается значение Sasha. Далее для переменной $secondname определяется не значение, а адрес, о котором говорилось выше, т. е. переменной Ssecondname = &$name присваивается адрес переменной при этом не важно, какое значение она имеет. Таким способом

можно оперировать переменными. Рассмотрим строку $secondname = "My name is $secondname";. До этой строки наша переменная $secondname, согласно адресу переменной, имелазначение Sasha. Послетого как произошло выполнение указанной строчки, переменная получит другое значение. Но при это мы оперируем не самими значениями, складывая их, а именно самим адресом, который принадлежит

этой переменной. Это все можно описать следующим способом. Представим, что существует два уровня. Уровень, на котором находятся значения переменных, назовем верхним уровнем. Уровень, на котором расположен адрес, — нижним. Таким образом, все, что находится на верхнем уровне, просто прибавляется к имеющемуся, а в нашем примере со строкой $secondname = "My name is $secondname"; выражение "My name is" прибавляется к значению, которое находится по указанному выше адресу. Следовательно, теперь на адресе, на который указывает переменная $secondname, имеется не одно слово, как было раньше, а фраза следующего содержания «My name is Sasha».


ВНИМАНИЕ

При написании строки $secondname = "My name is $secondname"; следите за двойными кавычками. Иначе в случае $secondname = 'My name is Ssecondname'; переменная получит значение "My name is $secondname".


Далее выполняется строка Ssecondname = "I hope $secondname". На основании имеющихся данных по этому адресу переменная приобретает значения: " I hope My name is Sasha", т. е. по этому же адресу опять происходит изменение. Притом значение ни в коем случае не изменяется, а именно прибавляется к существующему. Строка echo $name; выведет не первоначальное значение, которому принадлежит эта переменная, а именно то значение, по адресу которой оно имеется, т. е. будет выведена фраза «I hope My name is Sasha». To же самое касается функции echo $secondname;. Получается, что эти переменные имеют одинаковые значения.

Проделав элементарную операцию:

$firstname = 'Ira';

$name = 'Sasha';

$secondname = &name;

$secondname = &firstname;

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

Обратите внимание на пример неправильного использования операции получения адреса:

<?php

$cout = 68;

$cout1 = &$cout;

$cout1 = &(45*2);

?>

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

знаний вы сможете дать логический анализ реализации программы. Перейдем сразу к строке, в которой неверно описывается работа с адресом. Наверное, вы уже догадались, что это строка $coutl=&(45*2);. Именно в ней возникнет ошибка при реализации программы. Дело в том, что в данном месте дается ссылка на выражение, Которое не имеет собственного имени. Когда происходит обращение к конкретному адресу переменной, необходимо, чтобы этот адрес имел имя, через которое к нему можно обратиться. Не обязательно, чтобы имя было постоянным, т. е. адрес может принадлежать сразу одной переменной, а потом, по мере усложнения программы, и многим. При этом само значение, находящееся на высоком уровне данной переменной, может изменяться.

<< Предыдущий параграф Следующий параграф >>
Оглавление