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

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

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

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
ент с 
ключом GLOBALS является не обычным массивом, а лишь ссылкой на $GLOBALS. Вот 
по- 
этому все и работает так, как было описано. 
Вооружившись механизмом создания ссылок, мы можем теперь наглядно продемон- 
стрировать, как работает инструкция global, а также заметить один ее интересный 

нюанс. Как мы знаем, global $a говорит о том, что переменная $a является гло- 
бальной, т. е., является синонимом глобальной $a. Синоним в терминах PHP — это 
ссылка. Выходит, что global создает ссылку? Да, никак не иначе. А вот как это 
вос- 
принимается транслятором: 
function Test() 
{ global $a; 
$a=10; 
} 
Приведенное описание функции Test() полностью эквивалентно следующему опи- 
санию: 
function Test() 
{ $a=&$GLOBALS[’a’]; 
$a=10; 
} 
Из второго фрагмента видно, что оператор Unset($a) в теле функции не уничтожит 
глобальную переменную $a, а лишь "отвяжет" от нее ссылку $a. Точно то же самое 
происходит и в первом случае. Вот пример: 
$a=100; 
function Test() 
{ global $a; 
Unset($a); 
} 
Test(); 
echo $a; // выводит 100, т. е. настоящая $a не была удалена в Test()! 

Часть III. Основы языка PHP 194 
Эта особенность инструкции global появилась только в PHP версии 4, т. е. когда 
начали поддерживаться ссылки! Если вы запустите приведенный только что при- 
мер на PHP версии 3, то при исполнении echo увидите предупреждение: $a не оп- 
ределена. Помните это при переносе старых сценариев на новый PHP версии 4. 
Как же нам удалить глобальную $a из функции? Существует только один способ: ис- 

пользовать для этой цели $GLOBALS['a']. Вот как это делается: 
function Test() { unset($GLOBALS['a']); } 
$a=100; 
Test(); 
echo $a; // Ошибка! Переменная $a не определена! 
Статические переменные 
Видимо, чтобы не отставать от других языков, создатели PHP предусмотрели еще 
один вид переменных, кроме локальных и глобальных, — статические. Работают они 
точно так же, как и в Си. Рассмотрим следующий пример (листинг 11.12): 
Листинг 11.12. Статические переменные 
function Silly() 
{ static $a=0; 
echo $a; 
$a++; 
} 
for($i=0; $i<10; $i++) Silly(); 
После запуска будет выведена строка 0123456789, как мы и хотели. Давайте теперь 

уберем слово static. Мы увидим: 0000000000. Это и понятно, ведь переменная $a 
стала локальной, и ей при каждом вызове функции присваивается одно и то же зна- 

чение — 0. 
Итак, конструкция static говорит компилятору о том, что уничтожать указанную 
переменную для нашей функции между вызовами не надо. В то же время присваива- 
ние $a=0 сработает только один раз, а именно — при самом первом обращении к 
функции (так уж устроен static). 
Рекурсия 
Конечно, в PHP поддерживаются рекурсивные вызовы функций, т. е. вызовы функци- 
ей самой себя (разумеется, не до бесконечности, а в соответствии с определенным 

условием). Это бывает чрезвычайно удобно для таких задач, как, например, обход 

Глава 11. Функции и области видимости 195 
всего дерева каталогов вашего сервера (с целью подсчитать суммарный объем, 
кото- 
рый занимают все файлы), или для других задач. Рассмотрим для примера функцию, 
которая рекурсивно вычисляет факториал из некоторого числа n (обозначается n!). 

Алгоритм стандартный: если n=0, то n!=1, а иначе n!=n*((n-1)!). 
function Factor($n) 
{ if($n<=0) return 1; 
else return $n*Factor($n-1); 
} 
echo Factor(20); 
Должен только предупредить вас не применять эту функцию факториала в реальной 
жизни — она приведена здесь исключительно для примера. Лучше вос
 
<<-[Весь Текст]
Страница: из 287
 <<-