Возврат функцией ссылки
До сих пор я рассматривал лишь функции, которые возвращают определенные значения— а именно, копии величин, использованных в инструкции return. Заметьте, это были именно копии, а не сами объекты. Например:
$a=100;
function R()
{ global $a; // объявляет $a глобальной
return $a; // возвращает значение, а не ссылку!
}
$b=R();
$b=0; // присваивает $b, а не $a!
echo $a; // âûâîäèò 100
В то же время мы бы хотели, чтобы функция R()
возвращала не величину, а ссылку на переменную $a, чтобы в дальнейшем с этой ссылкой можно было работать точно так же, как и с $a. Например, это может очень пригодиться в объектно-ориентированном программировании на PHP (основы которого мы рассмотрим в пятой части книги), когда функция должна возвращать именно объект, а не его копию.
Как же нам добиться нужного результата? Использование оператора $b=&R(), к сожалению, не подходит, т. к. при этом мы получим в $b
ссылку не на $a, а на ее копию. Если задействовать return &$a, то появится сообщение о синтаксической ошибке (PHP воспринимает & только в правой части оператора присваивания сразу после знака =). Но выход есть. Воспользуемся специальным синтаксисом описания функции, возвращающей ссылку (листинг 11.15):
Листинг 11.15. Возвращение ссылки
$a=100;
function &R() // & — возвращает ссылку
{ global $a; // объявляет $a глобальной
return $a; // возвращает значение, а не ссылку!
}
$b=&R(); // не забудьте & !!!
$b=0; // присваивает переменной $a!
echo $a; // выводит 0. Это значит, что теперь $b — синоним $a
Как видим, нужно поставить &
в двух местах: перед определением имени функции, а также в правой части оператора присваивания при вызове функции. Использовать амперсанд в инструкции return не нужно.
Лично я не нахожу такой синтаксис удобным. Достаточно по-ошибке всего один раз пропустить &
при вызове функции, как переменной $b
будет присвоена не ссылка на $a, а только ее копия со всеми вытекающими из этого последствиями. При использовании объектно-ориентированного программирования это может породить логические ошибки, выглядящие крайне странно. Поэтому я рекомендую применять возврат ссылки как можно реже, и только в тех случаях, когда это действительно необходимо.