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

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

Решение
Верните массив и используйте функцию 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');

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

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

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Возвращение значений по ссылке
Возвращение информации об ошибке
Вызов переменных функций
Доступ к глобальной переменной внутри функции
Доступ к параметрам функций

Вернуться в раздел: PHP / 6. Функции