|
ент с
ключом 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);
Должен только предупредить вас не применять эту функцию факториала в реальной
жизни — она приведена здесь исключительно для примера. Лучше вос
|
|