Аргументи на функция

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

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

Пример 17-5. Предаване на масиви към функции

<?php
function takes_array($input)
{
    echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
?>

Предаване на аргументи по референция

По подразбиране, аргументите се предават на функциите по стойност (така че ако промените стойността на аргумента вътре във функцията, това няма да промени съответната променлива извън нея). Ако искате да разрешите на функция да променя аргументите си, трябва да ги предадете по референция.

Ако искате даден аргумент на функция винаги да бъде предаван по референция, можете да предшествате името на аргумента с амперсанд (&) в дефиницията на функцията:

Пример 17-6. Предаване на функционални параметри по референция

<?php
function add_some_extra(&$string)
{
    $string .= 'и още нещо.';
}
$str = 'Това е низ ';
add_some_extra($str);
echo $str;    // извежда 'Това е низ и още нещо.'
?>

Стойности на аргументи по подразбиране

Функция може да дефинира стойности по подразбиране за скаларни аргументи, както в C++, така:

Пример 17-7. Употреба на параметри по подразбиране във функции

<?php
function makecoffee($type = "капучино")
{
    return "Приготвяне на чаша $type.\n";
}
echo makecoffee();
echo makecoffee("еспресо");
?>

Изходът от горния откъс е:

Приготвяне на чаша капучино.
Приготвяне на чаша еспресо.

PHP позволява също и употребата на масиви и на специалния тип NULL за стойности по подразбиране, например:

Пример 17-8. Употреба на не-скаларни типове за стойности по подразбиране

<?php
function makecoffee($types = array("капучино"), $coffeeMaker = NULL)
{
    $device = is_null($coffeeMaker) ? "на ръка" : $coffeeMaker;
    return "Приготвяне на чаша ".join(", ", $types)." $device.\n";
}
echo makecoffee();
echo makecoffee(array("капучино", "лаваца"), "с машина за кафе");
?>

Стойността по подразбиране трябва да бъде константа, а не (например) променлива, член на клас или извикване на функция.

Забележете, че когато се използват аргументи по подразбиране, те трябва да бъдат от дясната страна, а тези без стойности по подразбиране - от лявата; в противен случай, нещата може да не работят според очакванията. Разгледайте следния откъс:

Пример 17-9. Неправилна употреба на подразбиращи се аргументи

<?php
function makeyogurt($type = "кисело", $flavour)
{
    return "Сервиране на чаша $type $flavour.\n";
}
 
echo makeyogurt("мляко");   // няма да работи според очакваното
?>

Изходът от горния пример е:

Warning: Missing argument 2 in call to makeyogurt() in 
/usr/local/etc/httpd/htdocs/php3test/functest.html on line 41
Сервиране на мляко.

Сега, сравнете горното с това:

Пример 17-10. Правилна употреба на подразбиращи се аргументи

<?php
function makeyogurt($flavour, $type = "кисело")
{
    return "Сервиране на чаша $type $flavour.\n";
}
 
echo makeyogurt("мляко");   // работи както трябва
?>

Изходът от този пример е:

Сервиране на чаша кисело мляко.

Забележка: От PHP 5, стойностите по подразбиране могат да бъдат предавани по референция.

Променлива дължина на списъка с аргументи

PHP 4 и нагоре поддържа списък с аргументи с променлива дължина в потребителски-дефинираните функции. Това е лесно, посредством функциите func_num_args(), func_get_arg() и func_get_args().

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