Если функцие необходимо добраться к глобальной переменной, то в ее теле необходимо до первого использования в своем теле внешней переменной объявить ее "глобальной" при помощи инструкции global:
// Возвращает название месяца по его номеру. Нумерация начинается с 1!
function getMonthName($n) {
global $monthes;
return $monthes[$n];
}
// Применение.
echo getMonthName(2); // выводит "Февраль"
?>
Массив $monthes, содержащий названия месяцев, довольно объемный. Поэтому описывать его прямо в функции было бы неудобно — он бы тогда создавался при каждом вызове функции.
В РНР есть еще один вид переменных - статические. Работают они точно так же, как и в С. Конструкция static сообщает компилятору, что уничтожать указанную переменную для функции между вызовами не надо. В то же время присваивание $count = 0 сработает только один раз, а именно — при самом первом обращении к функции. Рассмотрим пример функции, которая подсчитывает, сколько раз она была вызвана.
<?php ## Статические переменные,
function selfcount() {
static $count = 0;
$count++;
echo $count;
}
for ($i=0; $i<5; $i++) selfcount();
?>
После запуска будет выведена строка 12345. Если убрать слово static, то выведет: 11111. Т.к.переменная $count стала локальной, и при каждом вызове функции ее значение не определено (что воспринимается оператором ++ как 0).
Стандарт РНР не поддерживает вложенные функции. Однако он поддерживает нечто, немного похожее на них. Вместо того чтобы, как и у переменных, ограничить область видимости для вложенных функций своими "родителями", РНР делает их доступными для всей остальной части программы, но только с того момента, когда "функция-родитель" была из нее вызвана.
<?php ## Вложенные функции,
function father($a) {
echo $a, "<br>";
function child($b) {
echo $b + 1, "<br>";
return $b * $b;
}
return $а * $а * child($a);
// фактически возвращает $а * $а * ($а+1) * ($а+1)
}
// Вызываем функции.
father(10);
child(30);
?>
Если вызвать их в обратном порядке, это приведет к ошибке.
В РНР поддерживаются рекурсивные вызовы функций, т. е. вызовы функцией самой себя .
Рассмотрим пример рекурсивной функции — факториал из некоторого числа n (обозначается n!), равный значению 2*3*4*...*n.
function factor($n) {
if ($n <= 0) return 1; //условие выхода из рекурсии