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

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

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


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

Наш совет состоит в том, что если вы модифицируете значение внутри функции, то возвращайте это значение и присваивайте его переменной, не принимая во внимание другие соображения, такие как значительное увеличение производительности.
Теги:
parts, second, функции, minute, explode, function, возможность, значения, функция, одного, return, чтобы, производительности, функцией, разобрать, median, элементов, stats, averages, поскольку, определить, массив, Например, неявно, изменена, затрудняет, пространство, являются, загромождает, использовать, также, Можно, стороны, существу, фрагмент
Добавлено: 21 Июля 2018 13:33:21 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...