PHP简写三元运算符"?:"解析错误,意外的":"。

34
我刚刚把一些旧的PHP文件上传到了新的服务器上,但是在使用短语法三元操作时出现了解析错误 (Unexpected ':')。例如:
$y = $x ?: "Some default";

我的php版本是5.2.16。代码中到处都是这些简写的"?:",所以在修改它们之前,我想看看是否有人知道这方面的情况,因为我已经有一段时间没有使用PHP了。


1
“将旧的PHP文件上传到新服务器” - 我认为你的意思是,“将新的PHP文件上传到旧服务器”!(这里使用的PHP语法比您(旧)服务器上安装的版本更新。) - MrWhite
为什么大家都称这个表达式为“三元操作符”?它只需要两个参数。这不是Elvis操作符吗? - ya.teck
2个回答

75

自 PHP 5.3 版本开始支持此语法。

表达式 (expr1) ? (expr2) : (expr3) 如果 expr1 求值为TRUE,则返回 expr2,否则返回 expr3。

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

有关更多背景,请参阅此示例

或者一个在注释中提供更有用信息的链接: http://www.php.net/manual/en/control-structures.if.php#102060


1http://php.net/manual/zh/language.operators.comparison.php


不正确,我正在使用 PHP 5.2.x,它正常工作。请参见下面的 Nightwolf 的答案... - philm
3
不行,这不能是 PHP 5.2.x。也许在你的 PHP 版本中可以运行这个 $a = $foo ? 'foo' : 'bar' - azat
2
PHP 5.2.x的速记需要空值,就像我下面的回答一样,但是在PHP 5.3中上述代码应该可以正常工作。 - Nightwolf
1
(对于匆忙的谷歌用户:philm和Nightwolf是错误的,而PHP手册是正确的。;) Nightwolf最终在/下面纠正了自己的答案。) - Sz.
1
我想补充一下:如果 expr1 评估为 true,那么将返回该评估的结果。换句话说,如果 expr1 是真值,它将不会再次被评估,但表达式的结果将像第一次评估时一样被使用。 - XedinUnknown

-2

由于您正在使用php 5.2.16,因此您的三元运算符需要2个选项,例如

$y = $x? "???" : "Some default";

变量 = 条件 ? 真值 : 假值 ;


PHP 5.2.x 需要这种语法,但原问题的语法在5.3中运行良好。 - Nightwolf
9
这是错误的。这不是一个简略的三元运算符,也不是用户想要的等效物。在 PHP 5.2 中的等效写法是 $y = $x ? $x : 'default'; - igorw
@igorw:我只是告诉用户为什么会出现错误,让他学习,而不是盲目地复制代码。 - Nightwolf
4
重申一下,短写法?:只能在PHP 5.3及以上版本中使用。 - John Carter
2
@Nightwolf,那不是“速记”,那是完整的三元运算符。看起来你混淆了三元运算符本身就是if/else的简短版本,但这个问题是关于速记三元运算符的,而你只是在谈论标准的三元运算符。很抱歉要回答这么老的问题,但当时似乎没有人能够澄清你的困惑。 - Niall
@Niall 当我写下答案时,我只知道并确认了 PHP 版本中缩短的 "if/else" 的需求,并相信它被称为三元运算符。更改为使用 ternary 而不是 shorthand。 - Nightwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接