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

function test($testvar)
{
  // Do something

  return $var1;
  return $var2;
}

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


当前回答

你总是只能返回一个变量,它可能是一个数组。但是你可以在函数内部修改全局变量。大多数时候,这不是很好的风格,但它是有效的。在类中,您通常从函数内部更改类变量而不返回它们。

其他回答

允许多次返回的语言通常只是将多个值转换为一个数据结构。

例如,在Python中,您可以返回多个值。但是,它们实际上只是作为一个元组返回。

你可以在PHP中返回多个值只需创建一个简单数组并返回。

答案是否定的。当解析器到达第一个return语句时,它将把控制转回调用函数—您的第二个return语句将永远不会执行。

从技术上讲,您不能返回多个值。然而,有多种方法可以绕过这个限制。最像返回多个值的方式是使用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 of array来获取多个返回值。例如:

function test($testvar)
{
  // do something
  //just assigning a string for example, we can assign any operation result
  $var1 = "result1";
  $var2 = "result2";
  return array('value1' => $var1, 'value2' => $var2);
}

这是最简单的方法:

public function selectAllUsersByRole($userRole, $selector) {

    $this->userRole = $userLevel;
    $this->selector = $selector;

    $sql = "SELECT * FROM users WHERE role <= ? AND del_stat = 0";
    $stm = $this->connect()->prepare($sql); // Connect function in Dbh connect to database file
    $stm->execute([$this->userRole]); // This is PHP 7. Use array($this->userRole) for PHP 5

    $usersIdArray = array();
    $usersFNameArray = array();
    $usersLNameArray = array();

    if($stm->rowCount()) {
        while($row = $stm->fetch()) {

            array_push($usersIdArray,    $row['id']);
            array_push($usersFNameArray, $row['f_name']);
            array_push($usersLNameArray, $row['l_name']);

            // You can return only $row['id'] or f_name or ...
            // I used the array because it's most used.
        }
    }
    if($this->selector == 1) {
        return $usersIdArray;
    }elseif($this->selector == 2) {
        return $usersFNameArray;
    }elseif($this->selector == 3) {
        return $usersLNameArray;
    }

}

我们如何调用这个函数呢?

$idData = $selectAllUsers->selectAllUsersByLevel($userRole, 0);
print_r($idData);
$idFName = $selectAllUsers->selectAllUsersByLevel($userRole, 1);
print_r($idFname);

就是这样。非常容易。