有可能有一个函数有两个返回值,像这样:
function test($testvar)
{
// Do something
return $var1;
return $var2;
}
如果是这样,我怎样才能分别得到每一个回报?
有可能有一个函数有两个返回值,像这样:
function test($testvar)
{
// Do something
return $var1;
return $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以不同的值存储该数组的元素,而不是存储实际的数组。使用这种技术会让你感觉像是返回了多个值。
列表解决方案是特定于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)。这可能感觉与返回多个值完全不同,但至少值得了解一下。
第三种方法是使用对象保存所需的不同值。这需要更多的类型,所以它不像上面的两个方法那样经常使用。但是,当在许多地方使用同一组变量时(当然,或者使用一种不支持上述方法的语言,或者不需要额外输入就可以这样做),使用这种方法可能是有意义的。
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[0];
$y = $array[1];
$z = $array[2];
关于上面的代码,最有趣的部分是,函数内部的代码与我提供的第一个示例中的代码相同;只有调用函数的代码发生了变化。这意味着由调用函数的人来决定如何处理函数返回的结果。
或者,也可以使用关联数组:
function getXYZ()
{
return array('x' => 4,
'y' => 5,
'z' => 6);
}
$array = getXYZ();
$x = $array['x'];
$y = $array['y'];
$z = $array['z'];
Php确实有一个压缩函数,它允许你做同样的事情,但写的代码更少。(好吧,示例的代码不会更少,但实际应用程序可能会更少。)然而,我认为节省的输入量是最少的,它使代码更难阅读,所以我自己不会这样做。不过,这里有一个例子:
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中有一个对应的可以在这里的调用代码中使用的对象,但由于使用它是一个坏主意(特别是对于像这样简单的事情),我甚至不会给出它的示例。问题是它会做“魔法”,为你创建变量,而你不能看到哪些变量被创建而不去代码的其他部分。
最后,我想说的是,列表并不能很好地使用关联数组。以下内容将达到你的期望:
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与关联数组结合使用。
其他回答
我想eligo已经解释得很清楚了。但如果你想返回两个值,把它们放到一个数组中并返回。
function test($testvar)
{
// do something
return array('var1'=>$var1,'var2'=>$var2);
//defining a key would be better some times
}
//访问返回值
$returned_values = test($testvar);
echo $returned_values['var1'];
echo $returned_values['var2'];
最佳实践是将返回的变量放入数组,然后使用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 />';
?>
根据定义,函数只返回一个值。
但是,正如您所假设的,该值可以是一个数组。
所以你当然可以这样做:
<?PHP
function myfunc($a,$b){
return array('foo'=>$a,'bar'=>$b);
}
print_r(myfunc('baz','bork'));
也就是说,无论你想解决什么问题,花点时间想一想都是值得的。虽然返回一个复杂的结果值(如数组或对象)是完全有效的,但如果你的想法是“我想返回两个值”,那么你可能设计得很糟糕。如果你的问题没有更多的细节,这很难说,但停下来三思总是有益无害的。
PHP仍然使用“out参数”吗?如果是这样,那么可以使用该语法修改函数中的一个或多个参数。在函数返回后,您可以自由地使用修改后的变量。
$var1 = 0;
$var2 = 0;
function test($testvar, &$var1 , &$var2)
{
$var1 = 1;
$var2 = 2;
return;
}
test("", $var1, $var2);
// var1 = 1, var2 = 2
这不是一个好方法,但我认为我们可以在一个函数中同时设置两个变量。