PHP速记三元运算符“?:”解析错误意外“:”

Posted

技术标签:

【中文标题】PHP速记三元运算符“?:”解析错误意外“:”【英文标题】:PHP Shorthand ternary operator "?:" Parse error unexpected ":" 【发布时间】:2011-09-10 18:10:40 【问题描述】:

我刚刚将一些旧的 php 文件上传到新服务器,并且在速记三元操作上遇到解析错误(意外的 ':')。例如:

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

php 版本是 5.2.16 代码中到处都是这些简写? p>

【问题讨论】:

“旧 PHP 文件到新服务器”- 我想你的意思是,“新 PHP 文件到旧服务器”! (此处使用的 PHP 语法比您(旧)服务器上安装的 PHP 版本更新。) 为什么大家都称这个表达式为三元运算符呢?它只需要两个参数。这不是Elvis operator吗? 【参考方案1】:

这仅在 PHP 5.3 之后可用

表达式 (expr1) ? (expr2) : (expr3) 如果 expr1 的计算结果为 TRUE,则为 expr2,如果 expr1 的计算结果为 FALSE,则为 expr3。

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

请参阅this example 了解更多上下文。

或更有用但在 cmets 中的注释: http://www.php.net/manual/en/control-structures.if.php#102060


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

【讨论】:

不正确,我使用的是 PHP 5.2.x,它工作正常。请参阅下面的 Nightwolf 的答案... 不,它可以t be PHP 5.2.x. Maybe in your PHP version work this $a = $foo 吗? 'foo' : 'bar'` ? PHP 5.2.x 的简写需要空值,如下面我的回答中所示,但以上在 PHP 5.3 中应该可以正常工作。 (对于赶时间的 Google 员工:philm 和 Nightwolf 是错误的,而 PHP 手册是正确的。;) Nightwolf 最终在他的答案/下方纠正了自己。) 我想添加以下内容:如果expr1 评估为true,则返回该评估的结果。换句话说,如果expr1 为真,则不会再次计算,但表达式的结果将与第一次计算时一样。【参考方案2】:

由于您使用的是 php 5.2.16,因此您的三元组需要 2 个选项,例如

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

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

【讨论】:

PHP 5.2.x 需要这种语法,但原始问题的语法在 5.3 中可以正常工作。 这是错误的。这既是 速记 三元,也不是用户想要的等价物。 PHP 5.2 中的等价物是$y = $x ? $x : 'default'; @igorw:我只是告诉用户为什么会出现错误以便他学习,而不是盲目复制代码。 再重复一遍,简写?:仅在5.3+中可用 @Nightwolf 这不是 速记,而是 full 三元运算符。您似乎感到困惑,因为三元运算符本身是 if/else 的简短版本,但这个问题是关于速记三元运算符的,而您只是在谈论标准三元运算符。很抱歉回答这么老的答案,但当时似乎没有人能解决您的困惑。

以上是关于PHP速记三元运算符“?:”解析错误意外“:”的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 速记三元运算符

php 三元和速记PHP

javascript:使用三元运算符的意外评估行为

C 三元运算符的意外结果

在条件中使用三元运算符会产生意外的输出

意外结果,Gnu C 中的三元运算符