Разработчику. Сборник рецептов PHP
Задавайте вопросы

Возвращение более одного значения

Вернуться назад

Задача

Необходимо вернуть из функции более одного значения.

Решение

Верните массив и используйте функцию list() для разделения элементов:

function averages($stats) {
     ...
     return array($median , $mean , $mode);
}

list($median , $mean , $mode) = averages($stats);

Обсуждение

С точки зрения производительности это не очень хорошая идея. Здесь мы имеем некоторые дополнительные накладные расходы, поскольку PHP должен сначала создать массив, а затем разобрать его. Вот что происходит в этом примере:

function time_parts($time) {
     return explode(' : ' , $time);

}

list($hour , $minute , $second) = time_parts(' 12:34:56 ');

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

Есть и еще одна возможность – передача значения по ссылке. Однако это несколько неуклюже и делает логически неочевидной передачу необходимых переменных функции. Например:

function time_parts($time , &$hour , &$minute , &$second) {
     list($hour , $minute , $second) = explode(' : ' , $time);

}

time_parts(' 12:34:56 ' , $hour , $minute , $second);

Не имея прототипа функции, невозможно, взглянув на этот фрагмент, определить, чем же, по существу, являются переменные $hour, $minute и $second, т. е. значения, возвращаемые функцией time_parts().

Можно также использовать глобальные переменные, но это загромождает глобальное пространство имен и затрудняет возможность определить, какая из переменных была неявно изменена в функции. Например:

function time_parts($time) {
     global $hour , $minute , $second;
     list($hour , $minute , $second) = explode(' : ' , $time);

}

time_parts(' 12:34:56 ');

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

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

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ