Глава 17. Функции

Съдържание
Потребителски-дефинирани функции
Аргументи на функция
Връщане на стойности
Променливи функции
Вътрешни (вградени) функции

Потребителски-дефинирани функции

Функция може да бъде дефинира посредством следния синтаксис:

Пример 17-1. Псевдо код, демонстриращ употребата на функции

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

Във функциите е разрешена употребата на какъвто и да е валиден PHP код, дори и дефиниция на други функции или класове.

В PHP 3, функциите трябва да бъдат дефинирани преди да бъдат използвани. След PHP 4 вече няма такова ограничение. Освен в случаите, когато функцията е условно дефинирана, както в двата примера по-долу.

Когато функция е условно дефинирна, то тя трябва да бъде дефинирана преди да бъде извикана.

Пример 17-2. Условни функции

<?php

$makefoo = true;

/* Не можем да извикаме foo() оттук,
   понеже тя все още не съществува,
   но можем да извикаме bar() */

bar();

if ($makefoo) {
  function foo()
  {
    echo "Аз не съществувам докато изпълнението на програмата не стигне до мен.\n";
  }
}

/* Сега можем спокойно да извикаме foo(),
   понеже $makefoo се е изчислило на истина */

if ($makefoo) foo();

function bar() 
{
  echo "Аз съществувам от стартирането на програмата.\n";
}

?>

Пример 17-3. Функции във функции

<?php
function foo() 
{
  function bar() 
  {
    echo "Аз не съществувам, докато не се извика foo().\n";
  }
}

/* Не можем да извикаме bar() все още,
   понеже не съществува. */

foo();

/* Сега можем да извикаме bar(),
   изпълнението на foo() я
   е направило достъпна. */

bar();

?>

Всички функции и класове в PHP имат глобален обхват - могат да бъдат извиквани извън функция, дори и да са били дефинирани вътре и обратно.

PHP не поддържа нито претоварване на функции, нито отменянето на дефиницията или повторното дефиниране на функция, която е била дефинирана преди това.

Забележка: Имената на функциите не са чувствителни към регистъра, но все пак добра практитка е функциите да се извикват със същите имена, с които са били дефинирани.

PHP 3 не поддържа променлив брой аргументи на функции, въпреки че агументите по подразбиране се поддържат (вж. Стойности на аргументите по подразбиране за повече информация). От PHP 4 и двете се поддържат: вж. Променлива дължина на списъка с аргументи и документацията на функциите func_num_args(), func_get_arg() и func_get_args() за повече информация.

В PHP е възможно рекурсивното извикване на функции. Все пак, избягвайте рекурсивното извикване на функция/метод с повече от 100-200 нива на рекурсия, тъй като това може да доведе до смачкване на стека, което да предизвика прекратяване на скрипта.

Пример 17-4. Рекурсивни функции

<?php
function recursion($a)
{
    if ($a < 20) {
        echo "$a\n";
        recursion($a + 1);
    }
}
?>