【问题标题】:php passing by reference not workingphp通过引用传递不起作用
【发布时间】:2012-02-10 09:41:21
【问题描述】:

我只是想通过尝试在 php.net 上找到的一些示例来理解 PHP 中的引用传递。我在 php 网站上找到了一个示例,但它不起作用:

function foo(&$var)
{
    return $var++;
}

$a=5;
echo foo($a); // Am I not supposed to get 6 here? but I still get 5

这是here找到的示例

谁能告诉我为什么变量 $a 得到 5 而不是 6?

【问题讨论】:

  • 我猜它会在执行 echo 语句后增加 $var 。尝试做echo ++$var;
  • @pinusnegra:要弄清楚它是如何工作的?看起来很简单,可以从中学习......
  • @pinusnegra 阅读第一行:“我只是想通过尝试在 php.net 上找到的一些示例来理解 PHP 中的引用传递。”

标签: php reference pass-by-reference


【解决方案1】:

您的代码和示例代码不一样。他们的行为方式不同是不是很奇怪?

要查看您期望的行为,您必须将$var++ 更改为++$var

这里发生的情况是,虽然 $a 的值 在函数返回后是 6,但由于后自增运算符 ($var++) 的工作方式,返回的值是 5 .您可以使用以下方法进行测试:

$a=5; 
echo foo($a); // returns 5
echo $a; // but prints 6!

【讨论】:

    【解决方案2】:

    因为$a++ 返回$a 然后加一。

    要做你想做的事,你需要做++$a

    http://www.php.net/manual/en/language.operators.increment.php

    【讨论】:

      【解决方案3】:

      这与increment operator 有关,而不是通过引用传递。如果您查看手册,您会看到表现出您想要的行为,您必须更改 foo() 以使用前增量而不是后增量,如下所示:

      function foo(&$var)
      {
          return ++$var;
      }
      

      现在:

      > $a = 5;
      > echo foo($a);
      6
      

      【讨论】:

        【解决方案4】:

        不,这很好用。 $var++ 返回 $var 的值,然后递增变量。所以返回值是5,也就是你echo。变量$a 现在更新为6

        【讨论】:

          【解决方案5】:

          尝试回显实际变量:

          echo $a; // 6
          

          如果您在返回之前递增,您的示例仍然有效:

          return ++$var;
          

          【讨论】:

            【解决方案6】:

            与问题没有直接关系,仅与主题相关。 似乎确实存在 PHP 错误...

            $arr = array();
            $arr["one"] = 1;
            $arr["two"] = 2;
            $arr["three"] = 3;
            
            foreach ($arr as $k => &$v) {
            $v += 3;
            }
            
            foreach ($arr as $k => $v) {
            echo("\n".$k." => ".$v);
            }
            

            输出:

            one => 4
            two => 5
            three => 5
            
            (changing '$v' to '$val' (or some other variable name other than '$v')       
            in the second (i.e. last) 'foreach' will result in the expected correct
            output (one => 4 two => 5 three => 6)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-11-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多