Как я должен возвращать несколько переменных в функцию (для лучшей практики)?

Просто любопытно узнать, что лучше всего для чего-то вроде этого:

Функция, которая возвращает несколько переменных – как следует возвращать эти переменные?

как это (глобализация):

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 

Но мне любопытно узнать, какой метод лучше всего подходит для простой ситуации?

Вы должны абсолютно вернуть массив. Это намного яснее. Вы даже можете использовать конструкцию list для моделирования нескольких возвращаемых значений a-la python:

 function foon() { return array('one', 'two', 'three'); } list($one, $two, $three) = foon(); 

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

Используйте ссылки (если это имеет смысл) http://de.php.net/manual/en/language.references.php

Пример:

 function myfun(&$var1, &$var2, &$var3) { $var1="foo"; $var2="foo"; $var3="foo"; } 

Или верните массив.

И НИКОГДА НЕ ИСПОЛЬЗУЙТЕ ГЛОБАЛЫ! Это очень плохой дизайн и не поддерживается.

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

Вы можете вернуть массив и список использования, чтобы получить значения, см. http://www.php.net/manual/en/function.list.php

 function multiple() { return array('val1', 'anotherval'); } list($var1, $var2) = multiple(); echo "$var1, $var2"; 

Работает для меня, я не знаю, как это быстро, но, возможно, он выглядит более чистым в вашем коде.

Вы можете использовать класс 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*/ 

Поскольку этот рейтинг настолько высок в 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);