Поиск

Создание и использование функций, возвращающих значение

Мы научились создавать функции, которые принимают аргументы. Следующий шаг заставить функцию возвратить результат, или значение. Для этого необ ходимо знать и применять следующее: вопервых, в функции надо использовать инструкцию return; вовторых, при вызове функции нужно както обработать возвращаемое значение. Обычно оно присваивается переменной, но можно, например, просто распечатать результат. Ниже приведен основной формат функции, которая принимает аргумент и возвращает значение:

function FunctionName ($Argument) {
statement(s);
return $Vaiue;
}

Обычно данная функция используется со строкой кода наподобие представ ленной ниже:

$Value = FunctionName($Variable);

Обратите внимание на то, что мы присвоили возвращаемое значение функ ции переменной. Создадим две функции на основе страницы numbers.php (гла ва 4, модифицированный вид глава 6).

Выполнение действия

  1. Откройте файл numbers.php в текстовом редакторе (листинг 9.5). Листинг 9.5 т Это последний вариант страницы numbers.php (глава 6). Мы разделим инструкции этого сценария на отдельные модули, создав две функции.
  2. 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>
  3. Откройте первый PHPраздел и создайте функцию CalculateTotal ( ) , которая содержит строки 1421 из исходной страницы.
  4. <?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;
    }

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

  5. Создайте вторую функцию.
  6. 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. Размещение в отдельной функции всех вычислений приносит двойную вы году: вопервых, позже функцию будет легче найти и модифицировать, так как она расположена в самом начале сценария, а не спрятана гдето в коде; вовто рых, если возникнет необходимость снова использовать действие в сценарии, это можно будет сделать без дублирования кода.

  7. Закройте первый PHPраздел и создайте стандартный HTMLзаголовок
  8. ?><HTMLxHEADxTITLE>Calculation Functions</TITLEx/HEADxBODY>
  9. Откройте новый PHPраздел и задайте переменные.
  10. <?php
    $Cost = 20.00;
    $Тах = 0.06;

    Мы не изменили значение переменной $Cost, но при желании вы можете задать свое собственное значение как этой переменной, так и переменной $Тах.

  11. Напишем основной РНРсценарий.
  12. 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 ( ) .

  13. Закройте PHPраздел и HTML.
  14. ?></BODYx/HTML>
  15. Сохраните сценарий (листинг 9.6) , загрузите его на сервер и протестируй те в браузере (рис. 9.4). Не забудьте послать в сценарий количество еди ниц товара (и значение скидки, если хотите), добавив его к адресу URL или через HTMLформу. Если количество единиц товара будет неизвест но, на экране появится сообщение «Please make sure», сгенерированное строкой 40.

Листинг 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, и результат будет сразу же распечатан. Хотя мы не сделали этого в нашем сценарии, вполне разумно, чтобы функция рас печатывала результаты.

Только одна инструкция return будет выполнена в функции, хотя функция может иметь многочисленные инструкции return. Допустим, вы решили создать функ цию, которая бы проверяла выполнение условия и возвращала соответствующее значение. В этом случае вы бы написали такой код:
if (условие) {
return TRUE; .
} else {
return FALSE;
Результат, возвращаемый функцией, был бы истинным или ложным в зависимос ти от того, выполнено ли условие. Инструкция return возвращает только одно значение. Для получения множе ственных значений необходимо использовать массивы. О том, где найти более подробную информацию о получении множественных значений, говорится в при ложении С.