Статические переменные
Когда мы внутри функции определяем значение переменной — это локальная переменная.
function Test(){ $a = 0; echo $a++; } Test(); //Выведет 0 Test(); //Выведет 0 Test(); //Выведет 0
Т.е. трижды вызвав функцию Test, получим три раза 0. Это локальные переменные, они живут то время, пока php внутри функции. Пока php не зашел в функцию, там ничего нет. Мы вызвали функцию, php зашел, создал переменную, присвоил ей значение 0. Ушел — все разрушил, ничего нет, переменная нигде не хранится.
Но иногда надо, чтобы php помнил значение переменной. Тогда объявляем переменную статической внутри функции (static $a =0;).
function Test(){ static $a = 0; echo $a++; } Test(); //Выведет 0 Test(); //Выведет 1 Test(); //Выведет 2
Т.е. первый раз php зайдет, присвоит $a=0. Переменная увеличится на 1. Когда php выйдет, он порушит все, кроме этой функции (ВНИМАНИЕ! Эта функция не стала глобальной). Далее php зайдет снова в функцию, выведет 1, потом 2 и т.д.
Рекомендация. Не создавать слишком много глобальных переменных. Весь глобальный массив со всеми глобальными переменными хранится в памяти, уменьшая быстродействие. Происходит лишняя инициализация переменных, путаница в коде. Глобальная переменная должна использоваться везде, быть востребованной везде.
Возврат значений
Часто нужно, чтобы функция не что-то сделала и вывела конечный результат, а чтобы она вернула этот результат. А мы сами решим, что с ним делать.
function getSum($num1, $num2){ return $num1 + $num2; // функция возвращает значение } $result = getSum(10, 435); // вызов функции, считаем сумму echo $result; // вывод результата
Return не только возвращает значение функции, но и заканчивает все внутри функции (т.е. грубо он еще работает и как break), и мы выходим из этой функции.
Рекурсивный вызов функций
Т.е. когда функция вызывает сама себя. Когда нужно сделать много действий с минимальными изменениями. Либо нужно сделать одно и тоже, но неопределенное число раз. Т.к. php не обнаруживает бесконечную рекурсию, то есть опасность, как в циклах, попасть в бесконечную рекурсию (зависнуть). Поэтому php нужно где-то остановить, нужен определенный код. См. пример ниже:
function factorial($n) { if ($n == 0) return 1; return $n * factorial($n-1); } $result = factorial(5) echo "5! = " . $result;
С рекурсией мы сталкиваемся постоянно. Например, архиваторы rar, zip, там внутри зашита рекурсия (им нужно зайти в папку => внутри еще папка => внутри еще папка). Дерево папок в Windows тоже отрисовывается с помощью рекурсии.