Просто любопытно узнать, что лучше всего для чего-то вроде этого:
Функция, которая возвращает несколько переменных – как следует возвращать эти переменные?
как это (глобализация):
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);