Приведём пример синтаксиса для описания функций:
Пример #1 Псевдокод описания функции
<?php
function foo($arg_1, $arg_2, /* ..., */ $arg_n)
{
echo "Пример функции.\n";
return $retval;
}
?>
Внутри функции разрешается любой корректный PHP-код, включая другие функции и даже объявления классов.
Имена функций следуют тем же правилам, что и другие метки в PHP.
Корректное имя функции начинается с буквы или знака подчёркивания,
за которым идёт любое количество букв, цифр или знаков
подчёркивания. В виде регулярного выражения имя выражается так:
^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\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 не поддерживает перегрузку функций, также невозможно переопределить или удалить функции, которые объявили раньше.
Замечание: Имена функций не зависят от регистра символов в кодировке ASCII от
A
доZ
, хотя хорошим тоном будет вызов функций в том виде, в каком функцию указали в объявлении.
Функции 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 уровней рекурсии может вызвать переполнение стека и привести к аварийному завершению скрипта. В частности, бесконечную рекурсию PHP считает программной ошибкой.