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

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

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

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

【问题讨论】:

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

标签: php syntax ternary-operator php-5.2


【解决方案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 的简短版本,但这个问题是关于速记三元运算符的,而您只是在谈论标准三元运算符。很抱歉回答这么老的答案,但当时似乎没有人能解决您的困惑。
猜你喜欢
  • 2020-12-31
  • 2012-02-11
  • 2012-12-11
  • 2014-05-03
  • 2017-03-05
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
相关资源
最近更新 更多