函数的多次返回
P粉022285768
P粉022285768 2024-03-25 15:58:34
0
2
506

是否可以有一个具有两个返回值的函数,如下所示:

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}

如果是这样,我如何才能分别获得每笔回报?

P粉022285768
P粉022285768

全部回复(2)
P粉548512637

从技术上讲,您不能返回多个值。但是,有多种方法可以解决该限制。最类似于返回多个值的方式是使用 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 本身定义的一些函数中(例如 str_replacepreg_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 确实有 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

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

P粉717595985

无法返回 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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板