【问题标题】:variable incremented inside function has value 1函数内部递增的变量值为 1
【发布时间】:2014-06-10 19:25:54
【问题描述】:

编辑:很抱歉,当我试图找出问题时,原始代码是一个迭代,我已经编辑了代码 This 问题开始类似,但这是我遇到的真正问题:

在这段代码中:

<?php
    $a = 2:

    function incr(){
        $a++;
    echo $a;
    }

    echo $a;
    incr();
?>

输出是 2,然后是 1,这向我表明变量 $a 在函数内部被初始化为 0。服务器是否知道我使用增量语法将变量初始化为 0?

【问题讨论】:

  • 您的问题是$a 不在您的函数范围内。在函数内部,$a 没有定义
  • 有趣的是,你从 echo incr() 中得到了 1;称呼。在 incr 中,$a 是未定义的。所以, $a++ 是未定义的,你不应该得到任何输出。这是对问题的简化,还是您实际上看到了该输出?粘贴到writecodeonline.com/php,只输出2个。
  • @Barbara undefined variables 只是一个通知,并且(基本上)执行null + 1 会将空值强制转换为整数类型,显然是在尝试添加之前的值0。请参阅type juggling 上的手册。您可以配置 php,以便将通知视为错误,但默认情况下不会。

标签: php scope


【解决方案1】:

$a 未定义,然后当你增加它时,它会转到1

function incr(){
    $a++; // $a is undefined
    return $a;
}

正如manual中指出的那样:

注意:

递增/递减运算符只影响数字和字符串。数组、对象和资源不受影响。 减少 NULL 值也没有效果,但增加它们会导致 1。

您可以使用global,它会按预期返回。

function incr(){
    global $a;
    $a++;
    return $a;
}

【讨论】:

  • 啊是的,这就是我想知道的。
【解决方案2】:

如果您希望它在函数内正确递增,您需要将代码更改为:

<?php
    $a = 2:

    function incr($a){
        return $a++;
    }

    echo $a;
    echo incr($a);
?>

函数内的$a和函数外的$a是你代码sn-p中两个完全不同的变量,它们不在同一个作用域中。

您可以在此处阅读有关变量范围的信息:http://www.php.net//manual/en/language.variables.scope.php

您也可以使用全局变量,在上一个链接中也提到过,但通常不建议使用它们。

【讨论】:

    【解决方案3】:

    使用这个:

    <?php
        $a = 2:
    
        function incr($a){
            return $a++;
        }
    
        echo $a;
        echo incr($a);
    ?>
    

    【讨论】:

      【解决方案4】:

      在 php 中,全局变量必须在使用它们的函数内声明为全局变量:

      <?php
          $a = 2:
      
          function incr(){
              global $a;
              $a++;
          }
      
          echo $a;
          incr();
          echo $a;
      ?>
      

      无意粗鲁,但这在手册中有说明: http://www.php.net/manual/en/language.variables.scope.php

      或者通过建议将它们作为变量传递给其他答案。请注意,PHP 还允许通过引用传递变量(至少在 PHP 5 中)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-28
        • 1970-01-01
        相关资源
        最近更新 更多