【问题标题】:Why is an empty value in a shorthand if-then-else returning `true`?为什么速记 if-then-else 中的空值返回 `true`?
【发布时间】:2014-06-14 01:06:05
【问题描述】:

这并不完全是一个“问题”,而是一个“为什么”的问题。

基于以下示例:

echo 'test' . ( true ?  : 'some-test' );

为什么会出现这样的结果:test1,而不是人们所期望的:test

或者换句话说:为什么是一个空的返回语句1(或者实际上是true)而不是null

【问题讨论】:

  • 它正在回显 test1 因为当您回显它时 true 始终为 1。尝试将 true 替换为 false。猜猜会发生什么?
  • 试试 echo 'test' 。 (真的?'':'一些测试');因为 true 总是返回 1
  • 我明白。真正的问题是:为什么一个空值首先返回为真。如果我这样做了(true ? true : 'some-test'),我会期待这个
  • @RakeshSharma 我知道如何避免这种情况。如前所述,这不是“问题”。我只是很好奇为什么首先返回 true 而不是 null。
  • 哦,有你的问题

标签: php if-statement control-structure shorthand-if


【解决方案1】:

As of PHP 5.3,三元?:运算符的中间部分可以省略。
foo ?: bar等价于foo ? foo : bar。所以true ?: ... 总是返回第一个true

foo ? : bar 意思是“nothing if true”是并且总是无效的,因为这个表达式 has 要返回 something,它不能只返回什么.如果有的话,你会想要这个:foo ? null : bar

【讨论】:

  • 有趣,所以?: 仍然被视为两个单独的标记,解析器只是检查它们之间是否存在表达式,而不管空格如何?我想这就是它如何保留标题“三元运算符”同时似乎至少接受两个表达式。
  • 显然。我没有意识到这一点,但以这种方式处理它而不是创建一个新的运算符 ?: 是有意义的。
  • 很有趣你如何使用东西很长一段时间,直到很久以后才发现 - 为什么 - 它实际上做了它所做的 :) 如果第一个语句为空,它会默认返回运算符。谢谢!
【解决方案2】:

这是因为 PHP 5.3

“从 PHP 5.3 开始,可以省略三元运算符的中间部分。如果 expr1 计算结果为 TRUE,则表达式 expr1 ?: expr3 返回 expr1,否则返回 expr3。”

Ternary Operator

【讨论】:

    【解决方案3】:

    猫王操作员

    还有一些额外的空格,但该语法通常称为the elvis operator

    考虑以下几点:

    $result = ($this ?: $that);
    

    如果$this 为真,$result 将为$this,否则为$that

    因此当做相当于:

    echo (true ?: 'some-test');
    

    结果是总是

    echo true;
    

    或字符串“1”。

    空白不等于空

    请注意:

    $var = (true ?      : 'some-test');
    

    等价于:

    $var = (true ? null : 'some-test');
    

    只有在后一个示例中,$var 才会为 null,因为它是标准的三元 if 语句;第一个语句是一个巨大的猫王运算符。

    【讨论】:

    • 我喜欢那个......猫王操作员
    • 你的猫王接线员已经变成了一个有雀斑伸出舌头的接线员...!?
    • 添加了额外的空格以进行澄清。我确实通常在没有它们的情况下使用它。但基本上:当语句为空时,返回算子结果?
    • 确实如此(感谢@lagbox 提供链接)。我不知道默认返回运算符结果。谢谢!
    【解决方案4】:

    var_dump(true ? : 'some-test');bool(true)

    var_dump('test' . true);string(5) "test1"

    我希望这部分很清楚。 这里的诡计是true ? : 'some-test' 的计算结果为true。这是 PHP 5.3 中引入的一种新行为,如果您省略中间表达式,则返回第一个表达式的值(在您的情况下为 true)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-14
      • 2014-07-16
      • 1970-01-01
      • 2013-06-28
      • 2013-08-30
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多