函数多次返回

时间:2010-08-10 17:53:56

标签: php

是否可以使用具有2个返回的函数,如下所示:

function test($testvar)
{
  // do something

  return $var1;
  return $var2;
}

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

31 个答案:

答案 0 :(得分:370)

从技术上讲,您不能返回多个值。但是,有多种方法可以解决这个限制。最常用的方式是返回多个值,使用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_replace中的$countpreg_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[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与关联数组相结合。

答案 1 :(得分:144)

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

答案 2 :(得分:63)

在你的例子中,第二次返回永远不会发生 - 第一次返回是PHP将运行的最后一件事。如果需要返回多个值,请返回一个数组:

function test($testvar) {

    return array($var1, $var2);
}

$result = test($testvar);
echo $result[0]; // $var1
echo $result[1]; // $var2

答案 3 :(得分:24)

在PHP 5.5中还有一个新概念:generators,您可以从函数中产生多个值:

function hasMultipleValues() {
    yield "value1";
    yield "value2";
}

$values = hasMultipleValues();
foreach ($values as $val) {
    // $val will first be "value1" then "value2"
}

答案 4 :(得分:19)

从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];

查看新功能页面: http://php.net/manual/de/migration71.new-features.php

答案 5 :(得分:16)

或者您可以通过引用传递:

function byRef($x, &$a, &$b)
{
    $a = 10 * $x;
    $b = 100 * $x;
}

$a = 0;
$b = 0;

byRef(10, $a, $b);

echo $a . "\n";
echo $b;

这将输出

100
1000

答案 6 :(得分:7)

它不可能有两个return语句。但是它不会抛出错误,但是当调用函数时,您将只收到第一个返回语句值。 我们可以使用数组的返回来获得多个值。例如:

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);
}

答案 7 :(得分:6)

我知道我已经很晚了,但是对于这个问题有一个很好而且简单的解决方案 使用解构可以一次返回多个值。

function test()
{
    return [ 'model' => 'someValue' , 'data' => 'someothervalue'];
}

现在你可以使用这个

$result = test();
extract($result);

extract为数组中的每个成员创建一个变量,以该成员命名。因此,您现在可以访问$model$data

答案 8 :(得分:6)

您可以从函数

返回多个数组和标量
function x()
{
    $a=array("a","b","c");
    $b=array("e","f");
    return array('x',$a,$b);
}

list ($m,$n,$o)=x();

echo $m."\n";
print_r($n);
print_r($o);

答案 9 :(得分:5)

根据定义,函数只返回一个值。

但是,正如您所假设的那样,该值可以是数组。

所以你当然可以这样做:

<?PHP
function myfunc($a,$b){
   return array('foo'=>$a,'bar'=>$b);
}
print_r(myfunc('baz','bork'));

那就是说,值得花一点时间思考你想要解决的问题。虽然返回一个复杂的结果值(如数组或对象)是完全有效的,但如果您认为“我想返回两个值”,那么您可能设计得很差。在你的问题中没有更多的细节,很难说,但是停下来三思而后行永远不会伤害。

答案 10 :(得分:5)

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

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

return array('value1','value2','value3','...');

答案 11 :(得分:4)

我已经实现了这样的多重返回值PHP函数。对你的代码很好。谢谢。

 <?php
    function multi_retun($aa)
    {
        return array(1,3,$aa);
    }
    list($one,$two,$three)=multi_retun(55);
    echo $one;
    echo $two;
    echo $three;
    ?>

答案 12 :(得分:3)

是和否,您不能返回多个变量/对象,但正如您所建议的那样,您可以将它们放入一个数组中并返回它,对数组的嵌套没有限制,因此您可以将它们打包以这种方式返回

答案 13 :(得分:3)

有些人可能更喜欢将多个值作为对象返回:

function test() {
    $object = new stdClass();

    $object->x = 'value 1';
    $object->y = 'value 2';

    return $object;
}

并称之为:

echo test()->x;

或者:

$test = test();
echo $test->y;

答案 14 :(得分:3)

PHP中的函数只能返回一个变量。你可以使用具有全局作用域的变量,你可以返回数组,或者你可以通过引用函数传递变量而不是更改值,但是所有这些都会降低代码的可读性。 我建议你看看课程。

答案 15 :(得分:3)

以为我会扩展上面的一些回复......

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,错误标志为0表示false =无错误。 希望这可以帮助!

答案 16 :(得分:2)

答案是否定的。当解析器到达第一个return语句时,它将控制权返回给调用函数 - 你的第二个return语句永远不会被执行。

答案 17 :(得分:2)

您始终只能返回一个可能是数组的变量。但是您可以从函数内部更改全局变量。这大部分时间都不是很好的风格,但它的确有效。在类中,您通常会在函数内更改类变量而不返回它们。

答案 18 :(得分:1)

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

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

然后

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

答案 19 :(得分:1)

最佳实践是将返回的变量放入数组中,然后使用<?php function add_subt($val1, $val2) { $add = $val1 + $val2; $subt = $val1 - $val2; return array($add, $subt); } list($add_result, $subt_result) = add_subt(20, 7); echo "Add: " . $add_result . '<br />'; echo "Subtract: " . $subt_result . '<br />'; ?> 将数组值分配给变量。

{{1}}

答案 20 :(得分:1)

上面带有绿色对勾的答案实际上是错误的。如果返回数组,则可以在PHP中返回多个值。有关示例,请参见以下代码:

`
<?php
function small_numbers()
{
    return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
?>
`

此代码实际上是从PHP网站的以下页面复制的:http://php.net/manual/en/functions.returning-values.php 我本人也曾多次使用相同的代码,因此可以确认它是好的并且可以工作。

答案 21 :(得分:1)

对于PHP 7.1 <=,您可以使用新的语法(而不是list函数):

/**
* @return  array  [foo, bar]
*/
function getFooAndBar(): array {
    return ['foo', 'bar'];
}

[$foo, $bar] = getFooAndBar();

print 'Hello '. $foo . ' and ' . $bar;

如果您要返回2-3个变量,对我来说是可以的,否则您应该使用具有所需属性的对象。

答案 22 :(得分:0)

<script type="text/javascript">
        var currURL = window.location.href;

                String.prototype.endsWith = function (currURL) {
                    var d = this.length - currURL.length;
                    return d >= 0 && this.lastIndexOf(currURL) === d;
                };
</script>

答案 23 :(得分:0)

php仍然使用“输出参数”吗?如果是这样,您可以使用语法修改函数中的一个或多个参数,然后在函数返回后可以自由使用修改后的变量。

答案 24 :(得分:0)

您可以通过引用

设置两个或更多变量的值
function t(&$a, &$b) {
    $a = 1;
    $b = 2;
}


t($a,$b);

echo $a . '  ' . $b;

输出:

1 2

答案 25 :(得分:0)

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

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

所以你可以通过创建一个简单的数组并返回它来在PHP中返回多个值。

答案 26 :(得分:0)

$var1 = 0;
$var2 = 0;

function test($testvar, &$var1 , &$var2)
{
  $var1 = 1;
  $var2 = 2;
  return;
}
test("", $var1, $var2);

// var1 = 1, var2 = 2 

这不是一个好方法,但我认为我们可以同时在一个函数中设置2个变量

答案 27 :(得分:-1)

我认为eliego已经清楚地解释了答案。但是,如果要返回两个值,请将它们放入数组并返回。

function test($testvar)
{
  // do something

  return array('var1'=>$var1,'var2'=>$var2);
//defining a key would be better some times   
}

//访问返回值

$returned_values = test($testvar);

echo $returned_values['var1'];
echo $returned_values['var2'];

答案 28 :(得分:-1)

这是最简单的方法

let url = require('url');
let request = require('request');

request.post({url:'http://website.com/something', agent: myAgent , form: {key:'value'}}, function(err,res,body){
    if(res.statusCode !== 200){
        console.log('err');
    } else {
        //set header cookie from response and send second request
    }
})

如何调用此函数?

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 php7, use array($this->userRole) for php5

    $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 cane return only $row['id'] or f_name or .....
//I used the array cause its most using
        }
    }
    if($this->selector == 1) {
        return $usersIdArray;
    }elseif($this->selector == 2) {
        return $usersFNameArray;
    }elseif($this->selector == 3) {
        return $usersLNameArray;
    }

}

就这样,非常疯狂

答案 29 :(得分:-4)

我遇到了类似的问题 - 所以我尝试了一下并搜索了一下(找到这个帖子)。经过5分钟的尝试和错误,我发现你可以简单地使用 “AND”在一行回报中返回两个(可能更多 - 尚未测试)。

我的代码:

  function get_id(){
    global $b_id, $f_id;
    // stuff happens
    return $b_id AND $f_id;
  }
  //later in the code:
  get_id();
  var_dump($b_id);
  var_dump($f_id); // tested output by var_dump

它有效。我得到了我期望获得/应该得到的两个值。我希望我能帮助任何人阅读这个帖子:)

答案 30 :(得分:-5)

使用全局变量:

<?php

function t($a) 
{
 global $add, $noadd;
 $add=$a+$a;
 $noadd=$a;
}

$a=1;
t($a);
echo $noadd." ".$add;
?>

这将回应1 2