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速记三元运算符“?:”解析错误意外“:”的主要内容,如果未能解决你的问题,请参考以下文章