函数的多个返回

是否有可能有这样的2返回一个函数:

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

如果是这样,我将如何分别得到每个回报?

没有办法返回2个variables。 虽然你可以传播一个数组并返回它; 创build一个条件返回一个dynamicvariables等

例如,这个函数将返回$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

 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解决scheme是一个相当特定于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本身定义的一些函数中(例如str_replace中的 $count , preg_match中的 $matches )。 这可能与返回多个值有很大不同,但至less值得了解。

第三种方法是使用一个对象来保存所需的不同值。 这是更多的打字,所以它不像以上两种方法一样频繁使用。 不过,在许多地方使用同一组variables(或者当然,使用不支持上述方法的语言,或者不需要额外的input就可以做到这一点),使用它可能是有意义的。

 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具有compactfunction,可以让你做同样的事情,但是在写较less的代码。 (好吧,示例代码不会less,但真实世界的应用程序可能会。)但是,我认为,键入保存的数量是最小的,它使代码难以阅读,所以我不会自己做。 不过,这里有一个例子:

 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 ,但由于使用它是一个坏主意(特别是对于这样简单的事情),我甚至不会提供一个样本它。 问题是,它会做“魔术”,并为你创buildvariables,而你不能看到哪些variables创build,而不去代码的其他部分。

最后,我想提一下,这个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 ,并且其他人将来可能会改变被调用函数中的代码(这可能发生在任何情况下),它可能会突然中断,所以我build议不要将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')); 

也就是说,值得花点时间思考一下你想要解决的问题。 虽然返回一个复杂的结果值(比如一个数组或者一个对象)是完全有效的,但是如果你想要的是“我想返回两个值”,那么你可能会devise得不好。 在你的问题中没有更多的细节,这很难说,但是不要停下来思考。

是的,你可以使用一个对象:-)

但最简单的方法是返回一个数组:

 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; ?> 

是和不是,你不能返回多个variables/对象,但是正如你所build议的那样,你可以把它们放到一个数组中,然后返回,对数组的嵌套没有限制,所以你可以把它们封装起来回来

PHP中的函数只能返回一个variables。 你可以使用具有全局作用域的variables,你可以返回数组,或者你可以通过引用函数传递variables,而不是改变值,但是所有这些都会降低代码的可读性。 我build议你看看课程。

以为我会扩大一些上面的回应….

 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> 

这会给你一个input字段和一个提交button,一旦提交,如果名称input字段为空,它将返回错误标志和消息。 如果名称字段有一个值,它将返回值/名称和一个错误标志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; 

答案是不。 当parsing器到达第一个返回语句时,它将把控制权redirect到调用函数 – 你的第二个返回语句永远不会被执行。

你总是只能返回一个可能是数组的variables。 但是你可以从函数内部改变全局variables。 这是大多数时间不是很好的风格,但它的作品。 在类中,通常在函数内部改变类variables而不返回它们。

添加数组中的所有variables,然后返回array

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

接着

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

最佳做法是将返回的variables放入数组中,然后使用list()将数组值分配给variables。

 <?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 />'; ?> 

虽然我在这里很晚,但find了一个可以使用的简单解决scheme。
假设这是你的function。

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

现在你可以使用这个

 $result = test(testvar); 

现在

 extract($result); 

您现在可以访问$model$data

允许多次返回的语言通常只是将多个值转换为数据结构。

例如,在python中你可以返回多个值,但是实际上它们只是作为一个元组返回。

所以你可以通过创build一个简单的数组并返回它返回PHP中的多个值。

您可以通过参考设置来获取两个或更多variables的值

 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仍然使用“输出参数”? 如果是这样,你可以使用语法来修改一个或多个参数进入你的函数,然后你可以在函数返回后自由使用修改后的variables。

我认为eliego已经清楚地解释了答案。 但是如果你想返回两个值,把它们放入一个数组并返回。

 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']; 

我有一个类似的问题 – 所以我试了一下,search了一下(find这个线程)。 经过5分钟的尝试和错误,我发现你可以简单地使用“AND”在一行返回中返回两个(也许更多 – 没有testing过)。

我的代码:

  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 

有用。 我得到了两个我期望得到/应该得到的值。 我希望我能帮助任何人读这个线程:)

使用全局variables如:

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

这将回声1 2