|
циональная переменная — это всего лишь переменная-строка,
содержащая имя функции, и ничего больше. Поскольку в PHP нет такого понятия,
как
области видимости для функций (есть только области видимости для локальных пе-
ременных), то конфликтов это не порождает — одному имени может соответствовать
Глава 11. Функции и области видимости 199
не более одной функции. Такой подход, на мой взгляд, не очень хорош, но он
дейст-
вительно работает, и это главное.
Возврат функцией ссылки
До сих пор я рассматривал лишь функции, которые возвращают определенные значе-
ния — а именно, копии величин, использованных в инструкции 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
Часть III. Основы языка PHP 200
Как видим, нужно поставить & в двух местах: перед определением имени функции, а
также в правой части оператора присваивания при вызове функции. Использовать
амперсанд в инструкции return не нужно.
Лично я не нахожу такой синтаксис удобным. Достаточно по-ошибке всего один
раз пропустить & при вызове функции, как переменной $b будет присвоена не
ссылка на $a, а только ее копия со всеми вытекающими из этого последствия-
ми. При использовании объектно-ориентированного программирования это
может породить логические ошибки, выглядящие крайне странно. Поэтому я
рекомендую применять возврат ссылки как можно реже, и только в тех случа-
ях, когда это действительно необходимо.
Пример функции: Dump()
В отладочных целях часто бывает нужно посмотреть, что содержит та или иная
пере-
менная. Однако, если эта переменная — массив, да еще многомерный, с выводом ее
содержимого на экран могут возникнуть проблемы. Решить их призвана следующая
функция, которую я назвал Dump(). Пользу от этой функции можно реально почувст-
вовать, лишь поработав с ней некоторое время. Уверяю, потом вы не сможете
понять,
как раньше без нее обходились…
Функция выводит содержимое любой, сколь угодн
|
|