holdtom
从技术上讲,您不能返回多个值。然而,有多种方法可以解决这一限制。最类似于返回多个值的方式是使用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 $zfunction getXYZ(&$a, &$b, &$c){
$a = 4;
$b = 5;
$c = 6; }getXYZ($x, $y, $z);这种技术也在php本身定义的一些函数中使用(例如,$count在……里面Str替换, $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[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有关联数组。