Поиск
Создание и использование функций, возвращающих значение
Мы научились создавать функции, которые принимают аргументы. Следующий шаг заставить функцию возвратить результат, или значение. Для этого необ ходимо знать и применять следующее: вопервых, в функции надо использовать инструкцию return; вовторых, при вызове функции нужно както обработать возвращаемое значение. Обычно оно присваивается переменной, но можно, например, просто распечатать результат. Ниже приведен основной формат функции, которая принимает аргумент и возвращает значение:
function FunctionName ($Argument) {
statement(s);
return $Vaiue;
}
Обычно данная функция используется со строкой кода наподобие представ ленной ниже:
$Value = FunctionName($Variable);
Обратите внимание на то, что мы присвоили возвращаемое значение функ ции переменной. Создадим две функции на основе страницы numbers.php (гла ва 4, модифицированный вид глава 6).
Выполнение действия
- Откройте файл numbers.php в текстовом редакторе (листинг 9.5). Листинг 9.5 т Это последний вариант страницы numbers.php (глава 6). Мы разделим инструкции этого сценария на отдельные модули, создав две функции.
- Откройте первый PHPраздел и создайте функцию CalculateTotal ( ) , которая содержит строки 1421 из исходной страницы.
- Создайте вторую функцию.
- Закройте первый PHPраздел и создайте стандартный HTMLзаголовок
- Откройте новый PHPраздел и задайте переменные.
- Напишем основной РНРсценарий.
- Закройте PHPраздел и HTML.
- Сохраните сценарий (листинг 9.6) , загрузите его на сервер и протестируй те в браузере (рис. 9.4). Не забудьте послать в сценарий количество еди ниц товара (и значение скидки, если хотите), добавив его к адресу URL или через HTMLформу. Если количество единиц товара будет неизвест но, на экране появится сообщение «Please make sure», сгенерированное строкой 40.
1 <HTML>
2 <HEAD>
3 <TITLE>Conditionals</TITLE>
4 </HEAD>
5 <BODY>
6 <?php •
7 /* Переменная $Quantity должна быть передана в эту страницу из формы.
$Discount необязательна. */v
8 $Cost =20.00;
9 $Тах = 0.06;
10 if ($Quantity) {
11 $Quantity = abs($Quantity);
12 $Discount = abs($Discount);
13 Tax++; // $Tax составляет 1.06.
14 $TotalCost = ($Cost * $Quantity);
15 if ( ($TotalCost < 50) AND ($Discount) ) {
16 print ("Your $$Discount will not apply because the total value
of the sale is under !\n<P>");
17 } • ,
18. . if ($TotalCost >= 50) {
19 $TotalCost = $TotalCost $Discount;
20 }
21 $TotalCost = $TotalCost * $Tax;
22 $Payments = round ($TotalCost, 2) / 12;
23 // Печать результатов.
24 print ("You requested to purchase $Quantity widget(s) at $$Cost
each.\n<P>");
25 print ("The total with tax, minus your $$Discount, comes to $");
26 printf ("%01.2f", $TotalCost);
27 print (".\n<P>You may purchase the widget(s) in 12 monthly
installments of $");
28 printf ("%01.2f", $Payments);
29 print (" each.\n<P>");
30 } else {
31 print ("Please make sure that you have entered both a quantity and
an applicable discount and then resubmit.\n");}
32 ?>
33 </BODY>
34 </HTML>
<?php
function CalculateTotal ($HowMany, $Price, $TaxRate, $Savings) {
$TaxRate++; // $TaxRate is now worth 1.06.
$TheCost = ($Price •* $HowMany) ;
if ( ($TheCost < 50) AND ($Savings) ) {
print ("Your $$Savings will not apply because the total value
of the sale is under !\n<P>");
if ($TheCost >= 50) {
—$TheCost = $TheCost $Savings;
$TheCost = $TheCost * $TaxRate;
return $TheCost;
}
Эта функция берет четыре аргумента (количество купленного товара (по штучно), цена за штуку, ставка налога и возможная скидка), проводит необхо димые вычисления для определения полной стоимости и возвращает это зна чение.
function CalculatePayments ($Amount, $NumberPayments) {
$Payments = round($Amount, 1} I $NumberPayments;
$Payments = sprintf ("%01.2f", $Payraents);
return $Payments;
}
Функция CalculatePayments ( ) возьмет два аргумента полную стоимость и количество платежей и выполнит простой подсчет. Сначала будет опреде лен размер платежа с помощью формулы, которая изначально писалась для этих целей в файле numbers.php.
Затем функцией sprintf ( ) будет отформатировано значение переменной $Payments. Как уже упоминалось в главе 4, эта функция работает точно так же, как и print f ( ) , только ничего не отправляет в браузер, а выдает строковое значение, которое можно снова присвоить той же переменной. В конце кон цов, функция sprintf ( ) возвращает значение переменной $Payments. Размещение в отдельной функции всех вычислений приносит двойную вы году: вопервых, позже функцию будет легче найти и модифицировать, так как она расположена в самом начале сценария, а не спрятана гдето в коде; вовто рых, если возникнет необходимость снова использовать действие в сценарии, это можно будет сделать без дублирования кода.
?><HTMLxHEADxTITLE>Calculation Functions</TITLEx/HEADxBODY>
<?php
$Cost = 20.00;
$Тах = 0.06;
Мы не изменили значение переменной $Cost, но при желании вы можете задать свое собственное значение как этой переменной, так и переменной $Тах.
if ($Quantity) {
$Quantity = abs($Quantity),.
$Discount = abs($Discount);
$TotalCost = CalculateTotal ($Quantity, $Cost,$Tax, $Discount);
// Печать результатов.
print ("You requested to purchase $Quantity widget(s)
'at $$Cost each.\n<P>");
print ("The total with tax, minus your $$Discount, comes to $");
printf ("%01.2f", $TotalCost) ;
print (".\n<P>You may purchase the widget (s) in 12
—monthly installments of $");
print (CalculatePayroents($TotalCpst, "12"));
print (" each.\n<P>") ;
} else { . v ,
print ("Please make sure that you have entered both a
—quantity and an applicable discount and then resubmit . \n" ) ;
За исключением вызовов функций этот раздел кода полностью идентичен тому, что представлен в главе 6. Но теперь мы повысили наглядность страни цы, выделив вычисления в отдельные функции. Также данный раздел демон стрирует два способа использования функций, возвращающих значения. На строке 31 переменной присваивается значение, которое возвращается функци ей CalculateTotal ( ) , а на строке 37 немедленно распечатывается результат вызова функции CalculatePayments ( ) .
?></BODYx/HTML>
Листинг 9.6 т Обе функции в этом сценарии возвращают значения. При вызове функции CalculateTotal ( ) возвращаемое значение присваивается пе ременной. При вызове функции CalculatePayments ( ) возвращаемое значение передается в браузер.
1 "?php
2 function CalculateTotal ($HowMany, $Price, $TaxRate, $Savings) {
3 $TaxRate++; // $TaxRate is now worth 1.06.
4 $TheCost = ($Price * $HowMany) ;
5 if ( ($TheCost < 50) AND ($Savings) ) {
6 print ("Your $$Savings will not apply because the total value
of the sale is under ! \n<P>" ) ;
7 }
8 if ($TheCost >= 50) {
9 $TheCost = $TheCost $Savings;
10 }
11 $TheCost = $TheCost * $TaxRate;
12 return $TheCost;
13 } // Конец функции CalculateTotal.
14 function CalculatePayments (SAmount, $Number Payments) {
15 $Payments = round<$Amount , 2) / $Number Payments;
16 $Paymente = eprintf ("%01.2f", $Payments) ;
17 return $Paymente;
18 } // Конец функции CalculatePayments.
19 ?>
20 <HTML>
21 <HEAD> . .
22 <TITLE>Calculation Functions</TITLE>
23 </HEAD>
24 <BODY>
25 <?php
26 $Cost = 20.00;
27 $Tax = 0.06;
28 if ($Quantity) {
29 $Quantity = abs($Quantity);
30 $Discount = abs($Discount);
31 $TotalCoet = CalculateTotal ($Quantity, $Coet, $Tax, $Diecount);
32 // Печать результатов.
33 print ("You requested to purchase $Quantity widget(s) at $$Cost
each.\n<P>"); .
34 print ("The total with tax, minus your $$Discount, comes to $");
35 printf ("%01.2f", $TotalCost);
36 print (".\n<P>You may purchase the widget(s) in 12 monthly
installments of $");
37 print (CalculatePayments($TotalCoet, "12"));
38 print (" each.\n<P>");
39 } else {
40 print ("Please make sure that you have entered both a quantity and
an applicable discount and then resubmit.\n");
41 } .
42 ?>
43 </BODY>
В функции CalculatePayments () допустимо заменить строку sprintf () на printf (), убрать инструкцию return, и результат будет сразу же распечатан. Хотя мы не сделали этого в нашем сценарии, вполне разумно, чтобы функция рас печатывала результаты.

if (условие) {
return TRUE; .
} else {
return FALSE;