Wiki-учебник по веб-технологиям: PHP/Cookies/АргументыФункций ...

Главная | Каталог |

Аргументы функций


У каждой функции может быть, как мы уже говорили, список аргументов. С помощью этих аргументов в функцию передается различная информация (например, значение числа, факториал которого надо подсчитать). Каждый аргумент представляет собой переменную или константу.

С помощью аргументов данные в функцию можно передавать тремя различными способами. Это передача аргументов по значению (используется по умолчанию), по ссылке и задание значения аргументов по умолчанию. Рассмотрим эти способы подробнее.

Когда аргумент передается в функцию по значению, изменение значения аргумента внутри функции не влияет на его значение вне функции. Чтобы позволить функции изменять ее аргументы, их нужно передавать по ссылке. Для этого в определении функции перед именем аргумента следует написать знак амперсанд «&».

<?php
// напишем функцию, которая бы добавляла
// к строке слово checked
function add_label(&$data_str){
$data_str .= "checked";
}
$str "<input type=radio name=article ";
// пусть имеется такая строка
echo $str ."><br>";
// выведет элемент формы –
// не отмеченную радио кнопку
add_label($str);
// вызовем функцию
echo $str ."><br>";
// это выведет уже отмеченную
// радио кнопку
?>


Пример 5.3. Передача аргументов по ссылке

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

Само значение по умолчанию должно быть константным выражением, а не переменной и не представителем класса или вызовом другой функции.

У нас есть функция, создающая информационное сообщение, подпись к которому меняется в зависимости от значения переданного ей параметра. Если значение параметра не задано, то используется подпись «Оргкомитет».

<?php
function Message($sign="Оргкомитет."){
// здесь параметр sign имеет по умолчанию значение "Оргкомитет"
echo "Следующее собрание состоится завтра.<br>";
echo 
"$sign<br>";
}
Message();
// вызываем функцию без параметра.
// В этом случае подпись – это Оргкомитет
Message("С уважением, Вася");
// В этом случае подпись
// будет "С уважением, Вася."
?>


Пример 5.4. Значения аргументов по умолчанию

Результатом работы этого скрипта будет:

Следующее собрание состоится завтра.
Оргкомитет.
Следующее собрание состоится завтра.
С уважением, Вася.

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

Например, мы хотим внести описание статьи в каталог. Пользователь должен ввести такие характеристики статьи, как ее название, автор и краткое описание.

Если пользователь не вводит имя автора статьи, считаем, что это Иванов Иван.

<?php
function Add_article($title$description,
$author="Иванов Иван"){
echo 
"Заносим в каталог статью: $title,";
echo 
"автор $author";
echo 
"<br>Краткое описание: ";
echo 
"$description <hr>";
}
Add_article("Информатика и мы",
"Это статья про информатику ...",
"Петров Петр");
Add_article("Кто такие хакеры",
"Это статья про хакеров ...");
?>


В результате работы скрипта получим следующее

Заносим в каталог статью: Информатика и мы, автор Петров Петр.
Краткое описание:
Это статья про информатику...
Заносим в каталог статью: Кто такие хакеры, автор Иванов Иван.
Краткое описание:
Это статья про хакеров...
Если же мы напишем вот так:

<?php
function Add_article($author="Иванов Иван",
$title$description){
// ...действия как в предыдущем примере
}
Add_article("Кто такие хакеры",
"Это статья про хакеров...");
?>


То в результате получим:
Warning: Missing argument 3 for
add_article() in
c:\users\nina\tasks\func\def_bad.php
on line 2

Списки аргументов переменной длины

В PHP4 можно создавать функции с переменным числом аргументов. То есть мы создаем функцию, не зная заранее, со сколькими аргументами ее вызовут. Для написания такой функции никакого специального синтаксиса не требуется. Все делается с помощью встроенных функций func_num_args(), func_get_arg(), func_get_args().

Функция func_num_args() возвращает число аргументов, переданных в текущую функцию. Эта функция может использоваться только внутри определения пользовательской функции. Если она появится вне функции, то интерпретатор выдаст предупреждение.

<?php
function DataCheck(){
$n func_num_args();
echo 
"Число аргументов функции $n";
}
DataCheck();
// выведет строку
// "Число аргументов функции 0"
DataCheck(1,2,3);
// выведет строку
// "Число аргументов функции 3"
?>


Пример 5.5. Использование функции func_num_args()

Функция func_get_arg (целое номер_аргумента ) возвращает аргумент из списка переданных в функцию аргументов, порядковый номер которого задан параметром номер_аргумента. Аргументы функции считаются начиная с нуля. Как и func_num_args(), эта функция может использоваться только внутри определения какой-либо функции.

Номер_аргумента не может превышать число аргументов, переданных в функцию. Иначе будет сгенерировано предупреждение, и функция func_get_arg() возвратит False.

Создадим функцию для проверки типа данных ее аргументов. Считаем, что проверка прошла успешно, если первый аргумент функции – целое число, второй – строка.

<?
function DataCheck(){
$check =true;
$n func_num_args();
// число аргументов,
// переданных в функцию
/* проверяем, является ли первый
переданный аргумент целым числом */
if ($n>=1) if (!is_int(func_get_arg(0)))
$check false;
/* проверяем, является ли второй
переданный аргумент строкой */
if ($n>=2)
if (!
is_string(func_get_arg(1)))
$check false;
return 
$check;
}
if (
DataCheck(123,"text"))
echo 
"Проверка прошла успешно<br>";
else echo 
"Данные не удовлетворяют
условиям<br>"
;
if (
DataCheck(324))
echo 
"Проверка прошла успешно<br>";
else echo 
"Данные не удовлетворяют условиям<br>";
?>


Пример 5.6. Функция для проверки типа данных, ее аргументов

Результатом работы будет следующее.

Проверка прошла успешно
Проверка прошла успешно

Функция func_get_args() возвращает массив, состоящий из списка аргументов, переданных функции. Каждый элемент массива соответствует аргументу, переданному функции. Если функция используется вне определения пользовательской функции, то генерируется предупреждение.
Перепишем предыдущий пример, используя эту функцию. Будем проверять, является ли целым числом каждый четный аргумент, передаваемый функции:

<?
function DataCheck(){
$check =true;
$n func_num_args();
// число аргументов,
// переданных в функцию
$args func_get_args();
// массив аргументов функции
for ($i=0;$i<$n;$i++){
$v $args[$i];
if (
$i == 0){
if (!
is_int($v)) $check false;
// проверяем,
// является ли четный аргумент целым
}
}
return 
$check;
}
if (
DataCheck(array("text"324)))
echo 
"Проверка прошла успешно<br>";
else echo 
"Данные не удовлетворяют
условиям<br>"
;
?>


Как видим, комбинации функций func_num_args(), func_get_arg() и func_get_args() используется для того, чтобы функции могли иметь переменный список аргументов. Эти функции были добавлены только в PHP 4. В PHP3 для того, чтобы добиться подобного эффекта, можно использовать в качестве аргумента функции массив. Например, вот так можно написать скрипт, проверяющий, является ли каждый нечетный параметр функции целым числом:

<?
function DataCheck($params){
$check =true;
$n count($params);
// число аргументов,
// переданных в функцию
for ($i=0;$i<$n;$i++){
$v $params[$i];
if (
$i !== 0){
// проверяем, является ли нечетный
// аргумент целым
if (!is_int($v)) $check false;
}
}
return 
$check;
}
if (
DataCheck("text"324))
echo 
"Проверка прошла успешно<br>";
else echo 
"Данные не удовлетворяют условиям<br>";
?>