【问题标题】:PHP loose typing in while loop comparisonPHP在while循环比较中松散输入
【发布时间】:2011-02-03 19:47:32
【问题描述】:

给定以下代码sn-p:

  $i= 11;
  function get_num() {
    global $i;
    return (--$i >= 0) ? $i : false;
  }
  while($num = get_num()) {
    echo "Number: $num\n";
  }

结果如下:

Number: 10
Number: 9
Number: 8
Number: 7
Number: 6
Number: 5
Number: 4
Number: 3
Number: 2
Number: 1

但是,我也希望它输出 Number: 0 - 但是 while 循环将 0 评估为 false,因此循环永远不会到达这一点。如何让循环仅在显式 false 上终止?

【问题讨论】:

    标签: php loops loose-typing


    【解决方案1】:
    <?php
      $i= 11;
      function get_num() {
        global $i;
        return (--$i >= 0) ? $i : false;
      }
      while(($num = get_num())!==false) {
        echo "Number: $num\n";
      }
    ?>
    

    【讨论】:

      【解决方案2】:

      您必须进行比较类型的比较,而不仅仅是值 - 这意味着使用 ===!== 运算符,而不是 ==!= .

      所以,你可以使用类似的东西:

      while(($num = get_num()) !== false) {
          echo "Number: $num\n";
      }
      

      这样,0 将不会被视为与 false 相同的东西。


      作为参考:Comparison Operators(引用)

      $a == $b : 相等 : TRUE 如果 $a 等于 $b
      $a === $b : 相同 : TRUE 如果$a 是 等于$b, 它们属于 同一类型

      【讨论】:

        【解决方案3】:
        while( ($num = get_num()) !== false ) {
        

        extra = 强制类型检查。

        【讨论】:

          【解决方案4】:

          我注意到您使用的是global。一些开发人员尖叫着在不必要的时候使用global。此外,如果您在 $num 声明之前写 false!==,则可以省略括号(没什么大不了的,只是一个注释)。

          选项 1

          function get_num() {
              static $i=11;  // effectively only declare the value once
              return (--$i >= 0) ? $i : false;
          }
          while(false!==$num=get_num()){
              echo "Number: $num\n";  // $i is NOT available outside the scope of the function.
          }
          

          选项 2

          function get_num($i) {
              return (--$i >= 0) ? $i : false;
          }
          $num=11;  // declare in global scope
          while(false!==$num=get_num($num)){  // pass it to function as an argument
              echo "Number: $num\n";
          }
          

          【讨论】:

            猜你喜欢
            • 2012-01-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-02
            • 2016-11-27
            • 1970-01-01
            • 2015-05-19
            • 2014-02-11
            相关资源
            最近更新 更多