Несколько возвратов из функции

Возможно ли, чтобы функция с двумя возвращалась так:

function test($testvar) { // do something return $var1; return $var2; } 

Если да, то как я могу получить каждый возврат отдельно?

Нет способа вернуть 2 переменных. Хотя вы можете распространять массив и возвращать его; создать условие для возврата динамической переменной и т. д.

Например, эта функция вернет $var2

 function wtf($blahblah = true) { $var1 = "ONe"; $var2 = "tWo"; if($blahblah === true) { return $var2; } return $var1; } 

В приложении:

 echo wtf(); //would echo: tWo echo wtf("not true, this is false"); //would echo: ONe 

Если вы хотите их обоих, вы можете немного изменить функцию

 function wtf($blahblah = true) { $var1 = "ONe"; $var2 = "tWo"; if($blahblah === true) { return $var2; } if($blahblah == "both") { return array($var1, $var2); } return $var1; } echo wtf("both")[0] //would echo: ONe echo wtf("both")[1] //would echo: tWo list($first, $second) = wtf("both") // value of $first would be $var1, value of $second would be $var2 

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

 function getXYZ() { return array(4,5,6); } list($x,$y,$z) = getXYZ(); // Afterwards: $x == 4 && $y == 5 && $z == 6 // (This will hold for all samples unless otherwise noted) 

Технически вы возвращаете массив и используете list для хранения элементов этого массива в разных значениях вместо хранения фактического массива. Использование этого метода заставит его больше всего походить на возвращение нескольких значений.

Решение list является скорее php-специфическим. Есть несколько языков с похожими структурами, но больше языков, которые этого не делают. Существует еще один способ, который обычно используется для «возврата» нескольких значений и доступен практически на каждом языке (так или иначе). Тем не менее, этот метод будет выглядеть совсем по-другому, поэтому, возможно, придется привыкнуть.

 // note that I named the arguments $a, $b and $c to show that // they don't need to be named $x, $y and $z function getXYZ(&$a, &$b, &$c) { $a = 4; $b = 5; $c = 6; } getXYZ($x, $y, $z); 

Этот метод также используется в некоторых функциях, определенных самим php (например, $count в str_replace , $matches matches в preg_match ). Это может сильно отличаться от возврата нескольких значений, но об этом, по крайней мере, стоит знать.

Третий метод – использовать объект для хранения различных значений, которые вам нужны. Это больше печатает, поэтому он не используется так часто, как два вышеупомянутых метода. Это может иметь смысл использовать это, однако, при использовании одного и того же набора переменных в ряде мест (или, конечно же, для работы на языке, который не поддерживает вышеуказанные методы или позволяет это сделать без дополнительной набрав).

 class MyXYZ { public $x; public $y; public $z; } function getXYZ() { $out = new MyXYZ(); $out->x = 4; $out->y = 5; $out->z = 6; return $out; } $xyz = getXYZ(); $x = $xyz->x; $y = $xyz->y; $z = $xyz->z; 

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

Во-первых, мы можем просто вернуть массив и не рассматривать его как нечто, кроме массива:

 function getXYZ() { return array(1,2,3); } $array = getXYZ(); $x = $array[1]; $y = $array[2]; $z = $array[3]; 

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

В качестве альтернативы можно использовать ассоциативный массив:

 function getXYZ() { return array('x' => 4, 'y' => 5, 'z' => 6); } $array = getXYZ(); $x = $array['x']; $y = $array['y']; $z = $array['z']; 

У Php есть compact функция, которая позволяет делать то же самое, что и выше, но при написании меньше кода. (Ну, у образца не будет меньше кода, но, вероятно, это приложение в реальном мире.) Однако, я думаю, что количество печатающих данных минимально, и это делает код более трудным для чтения, поэтому я бы сам этого не делал. Тем не менее, вот пример:

 function getXYZ() { $x = 4; $y = 5; $z = 6; return compact('x', 'y', 'z'); } $array = getXYZ(); $x = $array['x']; $y = $array['y']; $z = $array['z']; 

Следует отметить, что в то время как у compact диска есть экземпляр в extract который может быть использован в вызывающем коде здесь, но поскольку это плохая идея его использовать (особенно для чего-то столь же простого, как это), я даже не дам образец для Это. Проблема в том, что он будет делать «волшебство» и создавать переменные для вас, в то время как вы не можете видеть, какие переменные создаются, не переходя в другие части кода.

Наконец, я хотел бы упомянуть, что list не очень хорошо сочетается с ассоциативным массивом. Следующее будет делать то, что вы ожидаете:

 function getXYZ() { return array('x' => 4, 'y' => 5, 'z' => 6); } $array = getXYZ(); list($x, $y, $z) = getXYZ(); 

Однако следующее будет делать что-то другое:

 function getXYZ() { return array('x' => 4, 'z' => 6, 'y' => 5); } $array = getXYZ(); list($x, $y, $z) = getXYZ(); // Pay attention: $y == 6 && $z == 5 

Если вы использовали list с ассоциативным массивом, а кто-то еще должен изменить код в вызываемой функции в будущем (что может произойти практически в любой ситуации), он может внезапно сломаться, поэтому я бы рекомендовал не комбинировать list с ассоциативными массивами.

В вашем примере второе возвращение никогда не произойдет – первое возвращение – это последнее, что будет работать PHP. Если вам нужно вернуть несколько значений, верните массив:

 function test($testvar) { return array($var1, $var2); } $result = test($testvar); echo $result[0]; // $var1 echo $result[1]; // $var2 

В PHP 5.5 также существует новая концепция: generators , в которых вы можете получить несколько значений из функции:

 function hasMultipleValues() { yield "value1"; yield "value2"; } $values = hasMultipleValues(); foreach ($values as $val) { // $val will first be "value1" then "value2" } 

Или вы можете пройти по ссылке:

 function byRef($x, &$a, &$b) { $a = 10 * $x; $b = 100 * $x; } $a = 0; $b = 0; byRef(10, $a, $b); echo $a . "\n"; echo $b; 

Это приведет к выводу

 100 1000 

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

 function test($testvar) { // do something //just assigning a string for example, we can assign any operation result $var1 = "result1"; $var2 = "result2"; return array('value1' => $var1, 'value2' => $var2); } 

Вы можете вернуть несколько массивов и скаляров из функции

 function x() { $a=array("a","b","c"); $b=array("e","f"); return array('x',$a,$b); } list ($m,$n,$o)=x(); echo $m."\n"; print_r($n); print_r($o); 

Функции, по определению, возвращают только одно значение.

Однако, как вы предполагали, это значение может быть массивом.

Поэтому вы можете сделать что-то вроде:

 <?PHP function myfunc($a,$b){ return array('foo'=>$a,'bar'=>$b); } print_r(myfunc('baz','bork')); 

Тем не менее, стоит подумать о том, что вы пытаетесь решить. При возврате значения комплексного результата (например, массива или объекта) вполне допустимо, если вы думаете, что «я хочу вернуть два значения», вы можете плохо проектировать. Без подробностей в вашем вопросе трудно сказать, но никогда не помешает остановиться и подумать дважды.

да, вы можете использовать объект 🙂

но самый простой способ – вернуть массив:

 return array('value1','value2','value3','...'); 

Я реализую это как функцию множественного возвращаемого значения PHP. Будьте добры с вашим кодом. Спасибо.

  <?php function multi_retun($aa) { return array(1,3,$aa); } list($one,$two,$three)=multi_retun(55); echo $one; echo $two; echo $three; ?> 

да и нет, вы не можете вернуть более одной переменной / объекта, но, как вы можете предположить, вы можете поместить их в массив и вернуть это, нет ограничений на вложение массивов, чтобы вы могли просто упаковать их таким образом вернуться

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

Думал, что я расширю несколько ответов сверху ….

 class nameCheck{ public $name; public function __construct(){ $this->name = $name; } function firstName(){ // If a name has been entered.. if(!empty($this->name)){ $name = $this->name; $errflag = false; // Return a array with both the name and errflag return array($name, $errflag); // If its empty.. }else if(empty($this->name)){ $errmsg = 'Please enter a name.'; $errflag = true; // Return both the Error message and Flag return array($errmsg, $errflag); } } } if($_POST['submit']){ $a = new nameCheck; $a->name = $_POST['name']; // Assign a list of variables from the firstName function list($name, $err) = $a->firstName(); // Display the values.. echo 'Name: ' . $name; echo 'Errflag: ' . $err; } ?> <form method="post" action="<?php $_SERVER['PHP_SELF']; ?>" > <input name="name" /> <input type="submit" name="submit" value="submit" /> </form> 

Это даст вам поле ввода и кнопку отправки после отправки, если поле ввода имени пуст, оно вернет флаг ошибки и сообщение. Если поле имени имеет значение, оно вернет значение / имя и флаг ошибки 0 для false = нет ошибок. Надеюсь это поможет!

Некоторые могут предпочесть возвращать несколько значений в качестве объекта:

 function test() { $object = new stdClass(); $object->x = 'value 1'; $object->y = 'value 2'; return $object; } 

И назовите это так:

 echo test()->x; 

Или:

 $test = test(); echo $test->y; 

Ответ – нет. Когда синтаксический анализатор достигает первого оператора return, он будет направлять управление обратно на вызывающую функцию – ваш второй оператор возврата никогда не будет выполнен.

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

Добавьте все переменные в массив и затем верните array .

 function test($testvar) { // do something return array("var1" => $var1, "var2" => @var2); } 

А потом

 $myTest = test($myTestVar); //$myTest["var1"] and $myTest["var2"] will be usable 

Лучшая практика состоит в том, чтобы поместить возвращаемые переменные в массив, а затем использовать list() для назначения значений массива переменным.

 <?php function add_subt($val1, $val2) { $add = $val1 + $val2; $subt = $val1 - $val2; return array($add, $subt); } list($add_result, $subt_result) = add_subt(20, 7); echo "Add: " . $add_result . '<br />'; echo "Subtract: " . $subt_result . '<br />'; ?> 

Хотя я довольно поздно здесь, но нашел простое решение, которое можно использовать.
Предположим, что это ваша функция.

 function test($testvar) { return [ 'model' => 'someValue' , 'data' => 'someothervalue']; } 

Теперь вы можете использовать это

 $result = test(testvar); 

И сейчас

 extract($result); 

Теперь вы можете получить $model и $data

Языки, которые допускают несколько возвратов, обычно просто преобразуют несколько значений в структуру данных.

Например, в python вы можете возвращать несколько значений, однако на самом деле они просто возвращаются как 1 кортеж.

Таким образом, вы можете вернуть несколько значений в PHP, просто создав простой массив и вернув это.

Вы можете получить значения двух или более переменных, установив их по ссылке

 function t(&$a, &$b) { $a = 1; $b = 2; } t($a,$b); echo $a . ' ' . $b; 

вывод:

 1 2 
 <?php function foo(){ $you = 5; $me = 10; return $you; return $me; } echo foo(); //output is just 5 alone so we cant get second one it only retuns first one so better go with array function goo(){ $you = 5; $me = 10; return $you_and_me = array($you,$me); } var_dump(goo()); // var_dump result is array(2) { [0]=> int(5) [1]=> int(10) } i think thats fine enough ?> 

Использует ли php «параметры вывода»? Если это так, вы можете использовать синтаксис для изменения одного или нескольких параметров, входящих в вашу функцию, тогда вы можете использовать измененную переменную после возврата функции.

Я думаю, что Элиго ясно объяснил ответ. Но если вы хотите вернуть оба значения, поместите их в массив и верните его.

 function test($testvar) { // do something return array('var1'=>$var1,'var2'=>$var2); //defining a key would be better some times } 

// для доступа к значениям возврата

 $returned_values=$this->test($testvar); echo $testvar['var1']; echo $testvar['var2']; 

У меня была аналогичная проблема – поэтому я попробовал и немного погуглил (нашел эту тему). После 5 минут попытки и ошибки я узнал, что вы можете просто использовать «AND», чтобы вернуть две (возможно, еще – еще не проверенные) в одной строке возврата.

Мой код:

  function get_id(){ global $b_id, $f_id; // stuff happens return $b_id AND $f_id; } //later in the code: get_id(); var_dump($b_id); var_dump($f_id); // tested output by var_dump 

оно работает. Я получил оба значения, которые я ожидал получить / должен получить. Надеюсь, я смогу помочь любому, кто читает эту тему 🙂

используйте глобальные переменные типа:

 <?php function t($a) { global $add, $noadd; $add=$a+$a; $noadd=$a; } $a=1; t($a); echo $noadd." ".$add; ?> 

Это будет эхо 1 2