三元运算符和字符串连接怪癖?

Ces*_*sar 50 php string-concatenation ternary-operator

嗨,我只是想知道为什么这段代码会产生(至少对我而言)不正确的结果.

好吧,可能我在这里有错

$description = 'Paper: ' . ($paperType == 'bond') ? 'Bond' : 'Other';
Run Code Online (Sandbox Code Playgroud)

我猜测如果paperType等于'Bond',则描述为'Paper:Bond',如果paperType不等于'Bond',则描述为'Paper:Other'.

但是,当我运行此代码时,结果是描述是"邦德"或"其他",让我想知道字符串'纸:'去了哪里?

med*_*iev 94

$description = 'Paper: ' . ($paperType == 'bond' ? 'Bond' : 'Other');
Run Code Online (Sandbox Code Playgroud)

尝试添加括号,以便字符串以正确的顺序连接到字符串.

  • 是的,这是正确的,它发生的原因是"." 运算符优先于"?:"运算符. (3认同)
  • 'Paper:'首先应用于布尔值($ paperType =='bond'的结果),换句话说,代码没有以正确的顺序发生. (2认同)
  • 要通过指定您基本上说的括号来解决这个问题,请返回'Bond'或'Other',然后将其添加到'Paper:'INSTEAD OF尝试将'Paper:'添加为true或false. (2认同)

Joã*_*lva 11

它与运算符优先级有关.您必须执行以下操作:

$description = 'Paper: ' . (($paperType == 'bond') ? 'Bond' : 'Other');
Run Code Online (Sandbox Code Playgroud)


hiz*_*rck 5

我想每个人都给出了解决方案,我想贡献出意外结果的原因。

首先,您可以在此处检查原点以及运算符的计算方式(左、右、关联等)。

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

现在,如果我们分析你的句子。

$ paperType = 'bond';
$ description = 'Paper:'. ($ paperType == 'bond')? 'Bond': 'Other';
Run Code Online (Sandbox Code Playgroud)

1) 我们查看表格,发现括号先求值,然后是 '.' (concatenation) 被评估,最后是三元运算符“?”,因此我们可以将其关联如下:

// evaluate the parenthesis ... ($ paperType == 'bond')
$ description = ('Paper:'. 1)? 'Bond': 'Other';
//result
$ description = 'Paper: 1'? 'Bond': 'Other';
Run Code Online (Sandbox Code Playgroud)

2)我们现在有了三元运算符,我们知道一个字符串被评估为“真”

// php 文档当转换为布尔值时,以下值被认为是 FALSE:

...空字符串和字符串“0”

$ description = true? 'Bond': 'Other';
Run Code Online (Sandbox Code Playgroud)

3)最后

$ description = 'bond';
Run Code Online (Sandbox Code Playgroud)

我希望我已经澄清了这个问题。你好。