15.15. Ссылки внутри конструктора
Для более корректной работы с классами, т. е. с его данными класса, создатель РНР ввел такую привлекательную вещь, как ссылки внутри конструктора. Собственно говоря, не зная данных возможностей и не изучая этот параграф, вы не создадите себе какой-либо пробел в знаниях. Все, что можно сделать при помощи ссылок внутри конструктора, аналогично тем операциям, которые вы умеете делать без ссылок. Ссылки, как правило, позволяют манипулировать с самим адресом. Это очень важно понять, так как иногда происходят ошибки при выполнении программы, если разработчик не знает этого. Использование ссылок внутри конструктора может привести к запутанному результату. Это также одна из причин, почему они не получают особого распространения, хотя иногда применяются. Приведенный пример познакомит вас с синтаксисом применения ссылок:
<?
class simp {
function foo($name) {
// создание ссылки внутри global массива $globalref
global $globalref;
$globalref[] = &$this;
// назначение name, чтобы передать переменную
$this->setName($name);
// и вызов ее обратно
$this->echoName();
}
function echoName($name) {
echo "<br>",$this->Name;
}
function setName ($name) {
$this->Name = $name;
}
}
?>
Данная программа весьма проста. Обратите внимание, что ссылка обозначается символом &. Приведем пример, который покажет принципы различия применения переменных и ссылок:
$num = new foo('constructor');
$num->echoName();
$globalref[0]->echoName();
В данном примере приведены переменные и способы обращения ИХ к классу. Результат работы программы будет следующий :
constructor
constructor
constructor
Теперь создадим аналогичный фрагмент скрипта, но с использованием ссылки:
$num2 = & new fоо ('constructor');
$num2->echoName() ;
$globalref[1]->echoName();
Результат работы программы будет
constructor
constructor
constructor
Заметьте, что переменная $num и массив $globalref[0], вызываемый как переменная _NOT_, являются не одной и той же переменной. Это потому, что оператор «new» по умолчанию возвращает не ссылку, а копию.
ВНИМАНИЕ
В РНР 4 не существует никаких принципиально важных различий использования копирования переменных вместо ссылок (т. е. своего рода операции присвоения). Однако в большинстве случаев лучше работать с копиями переменных, чем со ссылками. Дело в том, что для того чтобы создать переменную, необходимо затратить некоторое время при обработке кода. А на копию переменных не затрачивается какое бы то ни было время. Исключение составляет работа с массивами или большими объектами при условии, что происходит изменение массива, а в последствии самого процесса и объекта. В этом случае самым рациональным решением является использование ссылок, что поможет производить изменения значений одновременно.
Приведем пример, иллюстрирующий все вышесказанное:
// сейчас мы изменим name и вы сможете увидеть,
// что $num и $globalref[0] изменили свои значения
$num->setName('set from outside');
// как было упомянуто ранее, дело обстоит не так
$num->echoNarae();
$globalref[0]->echoName();
/* результат :
set on object creation
set from outside */
// посмотрите на различия между $num2 и $globalref[1] $num2->setName('set from outside');
// тут $num2->Name, а массив $globalref[1]->Name аналогично
$num2->echoName();
$globalref[1]->echoName();
В результате выполнения программы на экран будет выведено:
set from outside
set from outside