Приведем пример синтаксиса, используемого для описания функций:
Пример #1 Псевдокод для демонстрации использования функций
<?php function foo($arg_1, $arg_2, /* ..., */ $arg_n) { echo "Example function.\n"; return $retval; } ?>
Внутри функции можно использовать любой корректный PHP-код, в том числе другие функции и даже объявления классов.
Имена функций следуют тем же правилам, что и другие метки в PHP. Корректное имя функции начинается с буквы или знака подчеркивания, за которым следует любое количество букв, цифр или знаков подчеркивания. В качестве регулярного выражения оно может быть выражено так: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.
Функции не обязаны быть определены до их использования, исключая тот случай, когда функции определяются условно, как это показано в двух последующих примерах.
В случае, когда функция определяется в зависимости от какого-либо условия, например, как это показано в двух приведенных ниже примерах, обработка описания функции должна предшествовать ее вызову.
Пример #2 Функции, зависящие от условий
<?php $makefoo = true; /* Мы не можем вызвать функцию foo() в этом месте, поскольку она еще не определена, но мы можем обратиться к bar() */ bar(); if ($makefoo) { function foo() { echo "Я не существую до тех пор, пока выполнение программы меня не достигнет.\n"; } } /* Теперь мы благополучно можем вызывать foo(), поскольку $makefoo была интерпретирована как true */ if ($makefoo) foo(); function bar() { echo "Я существую сразу с начала старта программы.\n"; } ?>
Пример #3 Вложенные функции
<?php function foo() { function bar() { echo "Я не существую пока не будет вызвана foo().\n"; } } /* Мы пока не можем обратиться к bar(), поскольку она еще не определена. */ foo(); /* Теперь мы можем вызвать функцию bar(), обработка foo() сделала ее доступной. */ bar(); ?>
Все функции и классы PHP имеют глобальную область видимости - они могут быть вызваны вне функции, даже если были определены внутри и наоборот.
PHP не поддерживает перегрузку функции, также отсутствует возможность переопределить или удалить объявленную ранее функцию.
Замечание: Имена функций регистронезависимы, тем не менее, более предпочтительно вызывать функции так, как они были объявлены.
Функции PHP поддерживают как списки аргументов переменной длины, так и значения аргументов по умолчанию. Смотрите также описания функций func_num_args(), func_get_arg(), и func_get_args() для более детальной информации.
Можно вызывать функции PHP рекурсивно.
Пример #4 Рекурсивные функции
<?php function recursion($a) { if ($a < 20) { echo "$a\n"; recursion($a + 1); } } ?>
Замечание: Рекурсивный вызов методов/процедур с глубиной более 100-200 уровней рекурсии может вызвать переполнение стека и привести к аварийному завершению скрипта. В частности, бесконечная рекурсия будет считаться программной ошибкой.