## Пользовательские функции

Функции определяют ключевым словом `function`, за которым через пробел идёт название функции и круглые скобки. Круглые скобки оставляют пустыми или определяют в скобках список параметров; параметры разделяют символом `,`. За круглыми скобками идёт пара фигурных скобок — тело функции. Приведём пример определения функции:

Пример #1 Объявление новой функции с названием `foo`

    <?php

    function foo($arg_1, $arg_2, /* ..., */ $arg_n)
    {
        echo "Пример функции.\n";
        return $retval;
    }

> Замечание:

> С PHP 8.0.0 список параметров допускает завершающую запятую:

>     <?php

>     function foo($arg_1, $arg_2,) {}

В теле функции записывают корректный PHP-код, даже другие функции и определения классов.

Имена функций следуют тем же правилам, что и другие метки в PHP. Корректное имя функции начинается с буквы или знака подчёркивания, за которым идёт любое количество букв, цифр или знаков подчёркивания. В виде регулярного выражения имя выражается так: `^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$`.

Подсказка

Смотрите также «Руководство по именованию».

Требования объявлять функции раньше появления ссылки на функции — нет, за исключением условного определения функции, как показывают два следующих примера.

Определение функции описывают до вызова функции, когда функцию определяют по условию, как в двух следующих примерах.

Пример #2 Условные функции

    <?php

    $makefoo = true;

    /* Нельзя вызвать функцию foo() в этом месте,
       поскольку функцию ещё не определили, но обращение
       к функции bar() доступно */
    if (function_exists('foo')) {
        foo();
    } else {
        echo "Функция foo пока не определена.\n";
    }

    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(),
       поскольку функцию ещё не определили */
    if (function_exists('bar')) {
        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);
        }
    }

    recursion(17);

> Замечание: Рекурсивный вызов функций и методов с глубиной более 100-200 уровней рекурсии может вызвать переполнение стека и привести к аварийному завершению скрипта. В частности, бесконечную рекурсию PHP считает программной ошибкой.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open