从函数返回多个

php
2022-08-30 11:44:35

有没有可能有一个具有两个返回的函数,如下所示:

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}

如果是这样,我怎样才能单独获得每个退货?


答案 1

从技术上讲,不能返回多个值。但是,有多种方法可以解决该限制。最像返回多个值的方式是使用关键字: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的解决方案。有几种语言具有类似的结构,但更多的语言没有。还有另一种通常用于“返回”多个值的方法,并且几乎每种语言都可以使用(以这种或那种方式)。但是,此方法看起来会大不相同,因此可能需要一些习惯。list

// 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在preg_match)。这可能与返回多个值有很大不同,但至少值得了解。$count$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确实具有允许您执行与上述相同的操作的功能,但同时编写更少的代码。(好吧,该示例的代码不会减少,但实际应用程序可能会。但是,我认为打字节省的数量很少,它使代码更难阅读,所以我不会自己做。不过,这里有一个示例: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'];

应该注意的是,虽然确实有一个对应物,可以在这里的调用代码中使用,但由于使用它是一个坏主意(特别是对于像这样简单的东西),我甚至不会给出它的示例。问题是它会做“魔术”并为您创建变量,而您却无法看到在不转到代码的其他部分的情况下创建了哪些变量。compactextract

最后,我想提一下,它不能很好地与关联数组一起使用。以下操作将执行您期望的操作: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

如果您与关联数组一起使用,并且其他人将来必须更改被调用函数中的代码(这可能发生在任何情况下),它可能会突然中断,因此我建议不要与关联数组组合。listlist


答案 2

无法返回 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

推荐