【问题标题】:unexpected cast to boolean?意外转换为布尔值?
【发布时间】:2011-02-23 14:09:54
【问题描述】:

鉴于此输入:http://example.com/item.php?room=248&supply_id=18823,以下 2 个块应该产生相同的结果。他们为什么不呢?除了咖啡,我还缺少什么?

这个块给出了预期值:

if (isset($_GET['supply_id']) && isset($_GET['room'])) {
    $id=validkey($_GET['supply_id']); //18823
    $room=validkey($_GET['room']); //248
    $arr=array('s'=>$id,'r'=>$room); //s=>18823, r=>248
}

但如果我一步完成检查和赋值,$id 最终等于 1 而不是 18823。为什么?

if (isset($_GET['supply_id']) && isset($_GET['room'])) {
    if($id=validkey($_GET['supply_id']) && $room=validkey($_GET['room'])) 
        $arr=array('s'=>$id",'r'=>$room); //s=>1, r=>248
}

这是我正在使用的功能:

function validkey($value){
    if(is_scalar($value)){
        $value=(int)$value;
        return ($value>0) ? $value : false;
    }
    return false;
}

【问题讨论】:

    标签: php syntax php-5.3


    【解决方案1】:

    你应该使用括号:

    if(($id=validkey($_GET['supply_id'])) && ($room=validkey($_GET['room']))) 
    

    否则validkey($_GET['supply_id']) && $room=validkey($_GET['room']) 的结果将分配给$id 变量,因为&& 运算符的优先级高于=

    【讨论】:

    • 这就是答案。我以前遇到过这个问题,第一次遇到它时真的很困惑——&& 的优先级高于=。所以你必须用一组额外的括号括起来。
    • 但是我认为这种语法通常是一个坏主意 - 它使代码更难遵循,并且更容易出现错误。
    • 是的,或者使用我不喜欢的AND ;)
    • 谨慎使用它。我偶尔会做类似if (($aRow = mysql_fetch_assoc($rQuery)) && $aRow['foo'] == true) 之类的事情,但是有一天取消引用数组会消除这种需要。
    【解决方案2】:

    && 运算符的绑定比 = 运算符强。

    所以你的代码基本上变成了if ($id = (validkey($_GET['supply_id']) && $room = validkey($_GET['room'])))

    --> 在 IF 语句中的 $foo = $bar 表达式周围添加括号。

    【讨论】:

      【解决方案3】:

      您的第二个示例中似乎有一个小错误 - $id 之后的杂散双引号。此外,您的第二种方法通常不受欢迎(在 if 构造中分配变量),因为它使代码更难遵循。更清楚的是:

      if (isset($_GET['supply_id']) && isset($_GET['room'])) {     
          $id=validkey($_GET['supply_id']); //18823     
          $room=validkey($_GET['room']); //248
      
          if($id && $room) {     
              $arr=array('s'=>$id,'r'=>$room); //s=>18823, r=>248 
          }
      } 
      

      【讨论】:

      • 额外的引用是一个错字。我已经修好了。如果分两步完成,我可以看到在哪里做作业和检查真相会更清楚,但我不认为我会打电话给validkey 两次。内部if只需要通过if($id && $room){}
      • 你说得对,我只是没有阅读我剪切和粘贴的代码 sn-p :) 我已经更新了我的答案。
      猜你喜欢
      • 2021-06-27
      • 2018-01-24
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 2012-02-25
      • 2015-02-20
      相关资源
      最近更新 更多