【问题标题】:PHP syntax surprise with conditional operator "?:" and "OR"条件运算符“?:”和“或”的PHP语法惊喜
【发布时间】:2015-11-07 09:18:39
【问题描述】:

今天,我被以下人张开了嘴:

$asdf = ((1 OR true) ? "asdf" : "fdsa");
var_dump($asdf); // print "asdf"

$asdf = (1 OR true) ? "asdf" : "fdsa";
var_dump($asdf); // print "asdf"

$asdf = (1 OR true ? "asdf" : "fdsa");
var_dump($asdf); // print true

$asdf = 1 OR true ? "asdf" : "fdsa";
var_dump($asdf); // print 1

好吧,最后一个并没有让我很惊讶,但是第三个呢? 谁能解释一下?

【问题讨论】:

    标签: php syntax operators ternary-operator conditional-operator


    【解决方案1】:

    $asdf = (1 OR true ? "asdf" : "fdsa");

    等于(1 OR (true ? "asdf" : "fdsa"));

    它等于(1 OR "asdf");

    这等于true;

    1 OR "asdf" 不等于 (1 OR "asdf")。如果不使用方括号,则 OR 运算符之后的语句不再重要。您将第一个元素分配为值。但是如果你使用括号,第一个元素将是括号中的语句

    【讨论】:

    • 嗨,(1 OR "asdf") 将返回 bool(true)。
    • 这并不能解释第三个和第四个例子之间的区别。
    • 嗨,Volvox,1 OR "asdf" 不等于(1 OR "asdf")。如果使用括号,PHP 返回布尔值,如您将在 PHP php.net/manual/en/language.operators.logical.php 的“逻辑运算符”页面中看到的那样。
    • 但是为什么不使用括号会返回int呢?
    • 但是你为什么不在你的回答中解释呢?
    【解决方案2】:

    这里:

    // use () - result in brackets assigned to $asdf
    $asdf = (1 OR true ? "asdf" : "fdsa");
    var_dump($asdf); // print true
    

    这里:

    // = has higher precedence so $asfd equals 1 
    // and it doesn't matter what is the result of ternary operator
    $asdf = 1 OR true ? "asdf" : "fdsa";
    // line equals to 
    ($asdf = 1) OR (true ? "asdf" : "fdsa");
    // so $asdf is always 1 here
    var_dump($asdf); // print 1
    

    【讨论】:

      【解决方案3】:

      这都是关于运算符优先级和它们的关联性

      http://php.net/manual/en/language.operators.precedence.php

      or 的优先级低于=,这就是为什么它会首先执行

      所以$asdf = 1 OR true ? "asdf" : "fdsa";

      会有点像

      ($asdf = 1) or true ? :"asdf" : "fdsa" 这就是为什么它会打印 1。

      $a or $b 检查 $a 或 $b 是否为真,如果 $a 为真则返回它甚至不去检查 $b

      第三种情况

      $asdf = (1 OR true ? "asdf" : "fdsa");

      () 的优先级高于=,所以它会在赋值之前执行。

      证明一下

      将 OR 更改为优先级高于 =||

      $asdf = 1 || true ? "asdf" : "fdsa";
      
      var_dump($asdf); // print asdf
      

      【讨论】:

      • 但是(1 OR true ? "asdf" : "fdsa") 到底是如何计算为true,而不是"asdf"
      • 因为 (1 OR "asdf") 为真:P
      • 啊,它将结果转换为布尔值。 PHP, not something else.
      • 是的,这是逻辑表达式。
      • 很好的答案,但你不是假设读者知道? 的优先级高于OR 吗?感觉就像您错过了解释的那一部分,其中$asdf = (1 OR true ? "asdf" : "fdsa"); 被简化为$asdf = (1 OR (true ? "asdf" : "fdsa"));,因此$asdf = 1 OR "asdf"(确实是铸造的,如上所述)。这是次要的,甚至有点多余,但它可能会帮助那些完全陌生的人。 (编辑:我对此有点生疏,所以如果我误解了什么,请原谅。编辑#2:我刚刚看到 vural 的回答解释了这一点。)
      猜你喜欢
      • 2016-04-03
      • 2011-04-07
      • 2014-03-08
      • 2013-03-21
      • 2011-08-09
      • 2022-01-07
      • 2011-06-04
      • 2020-08-19
      • 2017-07-22
      相关资源
      最近更新 更多