|
начинается с 1!
function GetMonthName($n)
{ global $Monthes;
return $Monthes[$n];
}
. . .
echo GetMonthName(2); // выводит "Февраль"
Часть III. Основы языка PHP 192
Согласитесь, массив $Monthes, содержащий названия месяцев, довольно объемист.
Поэтому описывать его прямо в функции было бы, мягко говоря, неудобно. В то же
время функция GetMonthName() представляет собой довольно преемлемое средство
для приведения номера месяца к его словесному эквиваленту (что может потребо-
ваться во многих программах). Она имеет единственный и понятный параметр: это
номер месяца. Как бы мы это сделали без глобальных переменных?
Массив $GLOBALS
В принципе, есть и второй способ добраться до глобальных переменных. Это — ис-
пользование встроенного в язык массива $GLOBALS. Последний представляет собой
хэш, ключи которого есть имена глобальных переменных, а значения — их величи-
ны.
Этот массив доступен из любого места в программе — в том числе и из тела функ-
ции, и его не нужно никак дополнительно объявлять. Итак, приведенный выше при-
мер можно переписать более лаконично:
// Возвращает название месяца по его номеру. Нумерация начинается с 1!
function GetMonthName($n) { return $GLOBALS["Monthes"][$n]; }
Кстати, тут мы опять сталкиваемся с тем, что не только переменные, но даже и
мас-
сивы могут иметь совершенно любую структуру, какой бы сложной она ни была. На-
пример, предположим, что у нас в программе есть ассоциативный массив $A,
элемен-
ты которого — двумерные массивы чисел. Тогда доступ к какой-нибудь ячейке этого
массива с использованием $GLOBALS мог бы выглядеть так:
$GLOBALS["A"][First"][10][20];
То есть получился четырехмерный массив!
Насчет $GLOBALS следует добавить еще несколько полезных сведений. Во-первых,
как я уже говорил, этот массив изначально является глобальным для любой функции,
а также для самой программы. Так, вполне допустимо его использовать не только в
теле функции, но также и в любом другом месте. Во-вторых, с этим массивом
допус-
тимы не все операции, разрешенные с обычными массивами. А именно, мы не мо-
жем:
r присвоить этот массив какой-либо переменной целиком, используя оператор =;
r как следствие, передать его функции "по значению" — можно передавать только
по ссылке.
Однако остальные операции допустимы. Мы можем при желании, например, по од-
ному перебрать у него все элементы и, скажем, вывести их значения на экран. И,
на-
конец, третье: добавление нового элемента в $GLOBALS равнозначно созданию новой
глобальной переменной (конечно, предваренной символом $ в начале имени, ведь в
самом массиве ключи — это имена переменных без символа доллара), а выполнение
Глава 11. Функции и области видимости 193
операции Unset() для него равносильно уничтожению соответствующей перемен-
ной.
А теперь я скажу нечто весьма интересное все о том же массиве $GLOBALS. Как вы
думаете, какой элемент (то есть, глобальная переменная) всегда в нем
присутствует?
Это — элемент GLOBALS, "которая" также является массивом, и в "которой" также
есть элемент GLOBALS... Так что же было первей — курица или яйцо (только не
надо
мне говорить, что первым был петух)?
А собственно, почему бы и нет? С чего это мы все привыкли, что в большом содер-
жится малое, а не, скажем, наоборот? Почему множество не может содержать себя
же
в качестве элемента? Очень даже может, и $GLOBALS — тому наглядный пример.
В PHP версии 3 такая ситуация была чистой воды шаманством. Однако с появлением
в
четвертой версии PHP ссылок все вернулось на круги своя. На самом-то деле
эле
|
|