【问题标题】:PHP Switch Condition Catching Unmatched ConditionPHP切换条件捕获不匹配的条件
【发布时间】:2013-12-06 20:33:42
【问题描述】:

我今天遇到了一个问题,(我设法解决了)。但是,我不明白为什么会这样。

我有这样的开关条件:

switch( $message['approval_status'] ){
    case self::APPROVED:
       $state['approved'] = true;
       break;
    // other irrelevant conditions
    default:
       break;
}

在哪里

const APPROVED = 2

我传入了2个变量,

如果我要使用这个功能两次,一次用

$message['approval_status'] = 1 和另一个与

$message['approval_status'] = true

上面的switch语句按预期传递了整数,也就是进入默认条件。然而,具有$message['approval_status'] = true 的变量被case self::APPROVED: 捕获,即使self::APPROVED = 2

为什么会这样?

【问题讨论】:

    标签: php switch-statement


    【解决方案1】:

    为了比较两者,PHP 必须将“2”转换为布尔值(switch 语句使用松散比较,因此不同类型的值必须转换为单一类型)。任何非零都将转换为“真”。

    【讨论】:

    • 那么,没有=== 开关之类的东西吗?
    • 为什么它会转换为 bool 呢?这是一个int vs bool测试,不应该将bool转换为int吗?
    • 这与“类型杂耍”有关。当松散地比较不同类型的两个值时,PHP 有一组基于上下文定义的规则。请参阅:php.net/manual/en/language.types.type-juggling.php。如果我们引用:php.net/manual/en/…,它会说:“如果运算符、函数或控制结构需要布尔参数,则值将自动转换为 [ 为布尔值]。”由于 switch() 需要一个布尔结果,因此它将两者都转换为布尔值。
    【解决方案2】:

    您的比较是针对非零值(也为真)评估布尔值(真)。测试是在真/假上完成的,所以它通过了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 2017-01-01
      • 1970-01-01
      相关资源
      最近更新 更多