По завершении работы функции часто бывает полезно вернуть некоторое значение, для чего результат вызова функции обычно присваивается некоторой переменной. Функции могут возвращать значения любых типов, в том числе массивы и списки. Пример приведен в листинге 4.2, где функция calculate_cost() вычисляет налог с заданной суммы и возвращает общую сумму вместе с налогом. Прежде чем переходить к рассмотрению листинга, просмотрите краткое описание алгоритма на псевдокоде:
Перед вызовом функции задать значения переменных: $price(цена товара) и $tax(налоговая ставка).
Объявить функцию calculate_cost(). При вызове функция получает два параметра: налоговую ставку и цену товара.
Вычислить цену с учетом налога и вернуть ее командой return.
Вызвать calculate_cost() и присвоить значение, возвращенное функцией, переменной $total_cost.
Вывести соответствующее сообщение.
Листинг 4.2. Создание функции для вычисления налога
$price = 24.99; $tax = .06;
function calculate_cost($tax, $price) {
$sales_tax = $tax;
return $price +($price * $sales_tax);
}
// Обратите внимание на возврат значения функцией calculate_cost().
$total_cost = calculate_cost($tax. $price);
// Округлить цену до двух десятичных цифр.
$total_cost = round($total_cost. 2);
print "Total cost: $".$total_cost;
// $total cost = 26.49
Функции, не возвращающие значений, также называются процедурами.
Существует и другой способ использования возвращаемых значений, при котором вызов функции включается прямо в условную/циклическую команду. В следующей программе(листинг 4.3) сумма счета пользователя сравнивается с предельным размером кредита. Алгоритм на псевдокоде выглядит так:
Объявить функцию check_limit(), которая при вызове получает два параметра. Первый параметр, $total_cost, определяет общую сумму счета, накопленную пользователем до настоящего момента. Второй параметр, $credit_limit, определяет максимальную сумму, которую может потратить пользователь.
Если накопленная сумма счета превышает предельный размер кредита, функция возвращает ложное значение(0).
Если условие команды i f оказывается ложным, работа функции еще не завершена. В этом случае общая сумма не превышает предельного размера кредита, поэтому функция должна вернуть логическую истину.
Вызвать функцию check_limit() в условии команды if. Проверить, какое значение было возвращено при вызове — истинное или ложное. В зависимости от результата проверки выполняется то или иное действие.
Если при вызове check_limit() было получено значение TRUE, мы предлагаем пользователю продолжить закупку. В противном случае пользователь информируется о превышении кредита.
Листинг 4.3. Сравнение текущей суммы счета пользователя с предельным размером кредита
$cost = 1456.22;
$limit = 1000.00;
function check_limit($total_cost, $credit_limit) {
if($total_cost > $credit_limit) :
return 0;
endif;
return 1;
}
if(check_limit($cost. $limit)) :
// Продолжить закупки
print "Keep shopping!";
else :
print "Please lower your total bill to less than $".$limit."!";
endif;
При выполнении листинга 4.3 будет выведено сообщение об ошибке, поскольку значение $cost превышает $limit.
Функция также может возвращать сразу несколько значений при помощи списка. Продолжая кулинарную тему, давайте напишем функцию, которая бы возвращала три лучших года для указанного сорта вина. Функция приведена в листинге 4.4, но сначала прочитайте алгоритм на псевдокоде:
Объявить функцию best_years(), вызываемую с одним параметром. Параметр $label определяет сорт вина, для которого пользователь хотел бы узнать три рекомендуемых года.
Объявить два массива, $merlot и $zinfandel. В каждом массиве хранится три рекомендуемых года для соответствующего сорта вина.
Написать команду return, которая бы использовала особые возможности переменных. Выражение $$label сначала интерпретирует переменную $label, а затем интерпретирует полученное значение как имя другой переменной. В настоящем примере массив merlot возвращается в виде списка, и каждый возвращаемый год занимает свою позицию в списке, для которого вызывалась функция.
Вывести сообщение с информацией о рекомендуемых годах.
Листинг 4.4. Возвращение функцией нескольких величин
// Сорт вина, для которого выводятся лучшие годы
$label = "merlot";
// Функция использует массивы и "переменную в переменной"
// для возвращения нескольких значений.
function best_years($label) {
$merlot = array("1987", "1983", "1977");
$zinfandel = array("1992", "1990", "1989");
return $$label;
}
// Функция list() используется получения возвращаемых значений.
list($yr_one, $yr_two, $yr_three) = best_years($label);
print "$label had three particularly remarkable years: $yr_one, $yr_two, and $yr_three.";
Программа выводит следующий результат:
merlot has three particularly remarkable years: 1987, 1983 and 1977.