Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

 
liveinternet.ru: показано количество просмотров и посетителей

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
циональная переменная — это всего лишь переменная-строка, 
содержащая имя функции, и ничего больше. Поскольку в 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(). Пользу от этой функции можно реально почувст- 

вовать, лишь поработав с ней некоторое время. Уверяю, потом вы не сможете 
понять, 
как раньше без нее обходились… 
Функция выводит содержимое любой, сколь угодн
 
<<-[Весь Текст]
Страница: из 287
 <<-