Пользовательские функции в PHP (Часть 2)
Передача аргументов пользовательским функциям
При объявлении функции можно указать список параметров, которые могут передаваться функции, например:
<?php
function funct($a, $b, /* ..., */ $z) {
... };
?>
При вызове функции funct() нужно указать все передаваемые параметры, поскольку они являются обязательными. В PHP пользовательские функции могут обладать необязательными параметрами или параметрами по умолчанию, но об этом позже.
Передача аргументов по ссылке
Согласно сложившимся традициям, во всех языках программирования есть два вида аргументов функций:
- параметры-значения;
- параметры-переменные.
Функции не могут изменить параметр-значение, то есть он доступен функции "только для чтения" - она может его использовать, но не более. В качестве параметра-значения необязательно указывать переменную, можно указать само значение, отсюда название - параметр-значение.
По умолчанию аргументы в функцию передаются по значению (это означает, что если вы измените значение аргумента внутри функции, то вне ее значение все равно останется прежним). Приведем пример:
<?php
function funct($string)
{
echo "<h3>Параметр = $string </h3>";
}
$str = 777;
funct(777);
funct($str);
// Функция 'funct' выведет строку 'Параметр = 777' дважды
?>
В отличие от параметров-значений, параметры-переменные могут быть изменены в процессе работы функции. Тут уже нельзя передавать значение, нужно обязательно передать переменную. В PHP для объявления параметров-переменных используется механизм передачи переменной по ссылке.
Если вы хотите разрешить функции модифицировать свои аргументы, вы должны передавать их по ссылке.
Если вы хотите, что бы аргумент всегда передавался по ссылке, вы должны указать амперсанд (&) перед именем аргумента в описании функции:
<?php
function funct(&$string)
{
$string .= 'а эта внутри.';
}
$str = 'Эта строка за пределами функции, ';
funct($str);
echo $str; // Выведет 'Эта строка за пределами функции, а эта внутри.'
?>
Параметры по умолчанию
При программировании часто возникает необходимость создания функции с переменным числом параметров. Тому есть две причины:
- Параметров слишком много. При этом нет смысла каждый раз указывать все параметры;
- Функции должны возвращать значения разных типов в зависимости от набора параметров.
В PHP функции могут возвращать любые значения в зависимости от переданных им параметров.
<?php
function makecup($type = "Чая")
{
return "Сделайте чашечку $type.\n";
}
echo makecup();
echo makecup("Кофе");
?>
Результат работы приведенного скрипта будет таким:
Сделайте чашечку Чая
Сделайте чашечку Кофе
PHP также позволяет использовать массивы и специальный тип NULL в качестве значений по умолчанию, например:
<?php
function makecup($types = array("Кофе"), $Maker = NULL)
{
$device = is_null($Maker) ? "сахаром" : $Maker;
return "Сделайте чашечку ".join(", ", $types)." с $device.\n";
}
echo makecup();
echo makecup(array("Кофе", "Чая"), "сливками");
?>
Рассмотренный скрипт выведет следующее:
Сделайте чашкчку Кофе с сахаром . Сделайте чашечку Кофе, Чая с сливками.
Значение по умолчанию должно быть константным выражением.
Обратите внимание, что все аргументы, для которых установлены значения по умолчанию, должны находится правее аргументов, для которых значения по умолчанию не заданы, в противном случае ваш код может работать не так, как вы этого ожидаете. Рассмотрим следующий пример:
<?php
function makecup($type = "чая", $cond)
{
return "Сделайте чашечку $type $cond.\n";
}
echo makecup("горячего"); // Не будет работать так, как мы могли бы ожидать
?>
Результат работы приведенного выше скрипта будет примерно следующим:
Warning: Missing argument 2 for makecup() in c:\inetpub\php.su\test.php on line 2
Сделайте чашечку горячего .
Теперь видоизменим рассмотренный скрипт, исправив в нем ошибки:
<?php
function makecup($cond,
$type = "чая"
)
{
return "Сделайте чашечку $type $cond.\n";
}
echo makecup("горячего"); // Теперь наш скрипт работает корректно!
?>
Результат работы исправленного скрипта будет выглядеть следующим образом:
Сделайте чашечку чая горячего.
Внимание! Начиная с PHP 5, значения по умолчанию могут быть переданны по ссылке!
Переменное число аргументов в функциях
Иногда мы точно не знаем, сколько параметров будет передано нашей функции. Специально для такого случая разработчики PHP предусмотрели возможность использования переменного числа аргументов.
Реализация этой возможности достаточно прозрачна и заключается в использовании функций func_num_args(), func_get_arg() и func_get_args().
Рассмотрим возможности рассмотренных стандартных функций:
Стандартная функция func_num_args() возвращает колличество аргументов, переданных пользовательской функции:
<?php
function funct()
{
$numargums = func_num_args();
echo "Колличество аргументов : $numargums\n";
}
funct(1, 2, 3); // Скрипт выведет 'Колличество аргументов: 3'
?>
Стандартная функция func_get_arg() возвращает элемент из списка переданных пользовательской функции аргументов:
<?php
function funct()
{
$numargs = func_num_args();
echo "Колличество аргументов: $numargs<br>\n";
if ($numargs >= 2) {
echo "Второй аргумент : ".func_get_arg(1)."<br>\n";
}
}
funct(1, 2, 3);
?>
Стандартная функция func_get_args() возвращает массив аргументов, переданных пользовательской функции:
<?php
function funct()
{
$numargs = func_num_args();
echo "Колличество аргументов : $numargs<br>\n";
if ($numargs >= 2) {
echo "Второй аргумент: " . func_get_arg(1) . "<br>\n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Аргумент $i is: " . $arg_list[$i] . "<br>\n";
}
}
funct(1, 2, 3);
?>
Обратите внимание, что при объявлении пользовательских функций в скобках мы ничего не пишем, то есть, как будто мы не передаем аргументы.