Нина Савельева - Курс "Язык программирования PHP"
Как происходит вызов функции? Указывается имя функции и в круглых скобках список значений ее параметров, если таковые имеются:
<?php
Имя_функции ("значение_для_параметра1",
"значение_для_параметра2",...);
// пример вызова функции – вызов функции
// вычисления факториала приведен выше,
// там для вычисления факториала числа 3
// мы писали: fact(3);
// где fact – имя вызываемой функции,
// а 3 – значение ее параметра с именем $n
?>
Когда можно вызывать функцию? Казалось бы, странный вопрос. Функцию можно вызвать после ее определения, т.е. в любой строке программы ниже блока function f_name(){...}. В PHP3 это было действительно так. Но уже в PHP4 такого требования нет. Все дело в том, как интерпретатор обрабатывает получаемый код. Единственное исключение составляют функции, определяемые условно (внутри условных операторов или других функций). Когда функция определяется таким образом, ее определение должно предшествовать ее вызову.
<?
$make = true;
/* здесь нельзя вызвать Make_event();
потому что она еще не существует, но можно
вызвать Save_info() */
Save_info("Вася","Иванов",
"Я выбрал курс по PHP");
if ($make){
// определение функции Make_event()
function Make_event(){
echo "
Хочу изучать Python<br>";
}
}
// теперь можно вызывать Make_event()
Make_event();
// определение функции Save_info
function Save_info($first, $last, $message){
echo "<br>$message<br>";
echo "Имя: ". $first . " ". $last . "<br>";
}
Save_info("Федя","Федоров",
"А я выбрал Lisp");
// Save_info можно вызывать и здесь
?>
Если функция однажды определена в программе, то переопределить или удалить ее позже нельзя. Несмотря на то, что имена функций нечувствительны к регистру, лучше вызывать функцию по тому же имени, каким она была задана в определении.
<?php
/* нельзя сохранить данные, т.е. вызвать
функцию DataSave() до того, как выполнена
проверка их правильности, т.е. вызвана
функция DataCheck() */
DataCheck();
DataSave();
function DataCheck(){
// проверка правильности данных
function DataSave(){
// сохраняем данные
}
}
?>
Рассмотрим подробнее аргументы функций, их назначение и использование.
Аргументы функций
У каждой функции может быть, как мы уже говорили, список аргументов. С помощью этих аргументов в функцию передается различная информация (например, значение числа, факториал которого надо подсчитать). Каждый аргумент представляет собой переменную или константу.
С помощью аргументов данные в функцию можно передавать тремя различными способами. Это передача аргументов по значению (используется по умолчанию), по ссылке и задание значения аргументов по умолчанию. Рассмотрим эти способы подробнее.
Когда аргумент передается в функцию по значению, изменение значения аргумента внутри функции не влияет на его значение вне функции. Чтобы позволить функции изменять ее аргументы, их нужно передавать по ссылке. Для этого в определении функции перед именем аргумента следует написать знак амперсанд «&».
<?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>";
// это выведет уже отмеченную
// радио кнопку
?>
В функции можно определять значения аргументов, используемые по умолчанию. Само значение по умолчанию должно быть константным выражением, а не переменной и не представителем класса или вызовом другой функции.
У нас есть функция, создающая информационное сообщение, подпись к которому меняется в зависимости от значения переданного ей параметра. Если значение параметра не задано, то используется подпись "Оргкомитет".
<?php
function Message($sign="Оргкомитет."){
// здесь параметр sign имеет по умолчанию значение "Оргкомитет"
echo "Следующее собрание состоится завтра.<br>";
echo "$sign<br>";
}
Message();
// вызываем функцию без параметра.
// В этом случае подпись – это Оргкомитет
Message("С уважением, Вася");
// В этом случае подпись
// будет "С уважением, Вася."
?>
Результатом работы этого скрипта будет:
Следующее собрание состоится завтра.
Оргкомитет.
Следующее собрание состоится завтра.
С уважением, Вася.
Если у функции несколько параметров, то те аргументы, для которых задаются значения по умолчанию, должны быть записаны после всех остальных аргументов в определении функции. В противном случае появится ошибка, если эти аргументы будут опущены при вызове функции.
Например, мы хотим внести описание статьи в каталог. Пользователь должен ввести такие характеристики статьи, как ее название, автор и краткое описание. Если пользователь не вводит имя автора статьи, считаем, что это Иванов Иван.
<?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:usersninatasksfuncdef_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"
?>
Функция 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;