Как я должен возвращать несколько переменных в функцию (для лучшей практики)?
Просто интересно узнать, что лучше всего для чего-то вроде этого:
Функция, которая возвращает несколько переменных - как следует возвращать эти переменные?
как это (глобализация):
function myfun(){
global $var1,$var2,$var3;
$var1="foo";
$var2="foo";
$var3="foo";
}//end of function
или как это (возврат массива):
function myfun(){
$var1="foo";
$var2="foo";
$var3="foo";
$ret_var=array("var1"=>$var1,"var2"=>$var2,"var3"=>$var3);
return $ret_var;
}//end of function
Я провел тест производительности, и похоже, что использование массивов происходит быстрее (после нескольких обновлений):
array took: 5.9999999999505E-6
global took: 2.0999999999938E-5
Но мне любопытно узнать, какой метод лучше всего практиковать для простой ситуации вроде этого?
Ответы
Ответ 1
Вы должны абсолютно вернуть массив. Это намного яснее. Вы можете даже использовать конструкцию list
для имитации нескольких возвращаемых значений a-la python:
function foon() {
return array('one', 'two', 'three');
}
list($one, $two, $three) = foon();
Изменить: в некоторых случаях ассоциативный массив также вполне уместен. Я не могу представить, что разница в производительности заслуживает этой потери ясности.
Ответ 2
Используйте ссылки (если это имеет смысл) http://de.php.net/manual/en/language.references.php
Пример:
function myfun(&$var1, &$var2, &$var3)
{
$var1="foo";
$var2="foo";
$var3="foo";
}
Или вернуть массив.
И НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ГЛОБАЛЫ! Это очень плохой дизайн и не поддерживается.
Ответ 3
Опция ассоциативного массива лучше с точки зрения обслуживания кода, так как вы не занимаетесь глобальным пространством имен. Также вам будет проще читать ваш код.
Ответ 4
Вы можете вернуть массив и список использования, чтобы получить значения, см. http://www.php.net/manual/en/function.list.php
function multiple() {
return array('val1', 'anotherval');
}
list($var1, $var2) = multiple();
echo "$var1, $var2";
Работает для меня, я не знаю, как это быстро, но, возможно, он выглядит более чистым в вашем коде.
Ответ 5
Вы можете использовать класс http://php.net/manual/en/keyword.class.php.
class Vari {
var $var1;
var $var2;
var $var3;
}
function myfun() {
$var = new Vari;
$var->var1="foo";
$var->var2="foo";
$var->var3="foo";
return $var;
}
$v = myfun();
echo $v->var1;
/*foo*/
Ответ 6
Так как это занимает столь высокое место в Google и тот факт, что мне потребовалось некоторое время, чтобы найти ясный ответ себе на что-то настолько простое...
Чтобы дать полный ответ и тщательно прояснить, как вернуть несколько переменных, которые вы действительно можете использовать независимо от своей функции:
function myFunction() {
//your code that returns your results to variables below
$var1 = 'message 1';
$var2 = 'message 2';
$var3 = 'message 3';
// must put all variables inside an array to get them outside of function
$return_array = ($var1, $var2, $var3);
// return your array inside function
return $return_array;
}
// call function (returns all variables in array)
$get_results = myFunction();
// call and assign individual variables outside of function
$var1 = $get_results[0];
$var2 = $get_results[1];
$var3 = $get_results[2];
// now you can use individual variables outside of function for example:
echo $var2; //will now output: message 2
echo $var3; //will now output: message 3
Если вы используете результаты запроса базы данных внутри своей функции более чем вероятно, вам нужно будет передать свою переменную подключения в функцию. Например, мы скажем, что $db - это наше соединение с базой данных, и вы просто измените две строки кода ниже:
//original code to change
function myFunction() {
//change to
function myFunction($db) {
//original code to change
$get_results = myFunction();
//change to
$get_results = myFunction($db);