PHP 4 на практике

       

Возврат значений из функции


По завершении работы функции часто бывает полезно вернуть некоторое значение, для чего результат вызова функции обычно присваивается некоторой переменной. Функции могут возвращать значения любых типов, в том числе массивы и списки. Пример приведен в листинге 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.


        Содержание раздела