有可能有一个函数有两个返回值,像这样:

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}

如果是这样,我怎样才能分别得到每一个回报?


当前回答

从PHP 7.1开始,我们对列表进行了适当的解构。 因此你可以这样做:

$test = [1, 2, 3, 4];
[$a, $b, $c, $d] = $test;
echo($a);
> 1
echo($d);
> 4

在函数中是这样的:

function multiple_return() {
    return ['this', 'is', 'a', 'test'];
}

[$first, $second, $third, $fourth] = multiple_return();
echo($first);
> this
echo($fourth);
> test

解构是一个非常强大的工具。它也能够解构key=>值对:

["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3];

看看PHP 7.1的新特性页面:

新功能

其他回答

我想我应该对上面的一些回复进行扩展....

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>

这将为您提供一个输入字段和提交按钮,一旦提交,如果名称输入字段为空,它将返回错误标志和一条消息。如果name字段有值,它将返回值/name,如果false =无错误,则返回错误标志0。 希望这能有所帮助!

在数组中添加所有变量,然后最终返回数组。

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

然后

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

从技术上讲,您不能返回多个值。然而,有多种方法可以绕过这个限制。最像返回多个值的方式是使用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与关联数组结合使用。

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

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

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