关于php 三元运算符的优先级问题。请教?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于php 三元运算符的优先级问题。请教?相关的知识,希望对你有一定的参考价值。

$i = 2; echo $i == 2 ? "A" : $i == 1 ? 'B' : 'C'; //答案是B ,解释一下为什么?是运算符的优先级吗?

三元运算符的优先级是从右到左的,因此上面顺序是:

$i = 2;
先运行:($i == 2 ? "A" : $i == 1)
然后再运行 (? 'B' : 'C';)
假设第一个运行的结果是 $ret 那么$ret的值为A;
那么第二个可以写成
$ret?'B':'C';
因$ret的值为A,是真值,所以结果是B。
参考技术A 因为php中三元运算符是从左向右计算的。所以计算的步骤应该是:

$i=2;
echo $i==2 ? 'A':$i==1
//这里已经得出 结果是 "A" ,后面的 $i==1 返回的结果是真,这项作为一个结果。
//下一步
"A"? 'B' : 'C';
//因为PHP的弱语言特性, “A” 被认为是 true ,所以返回是 'B'

PHP 三元运算符说明

【中文标题】PHP 三元运算符说明【英文标题】:PHP Ternary operator clarification 【发布时间】:2011-04-04 13:45:59 【问题描述】:

我经常使用三元运算符,但我在文档中找不到任何关于此的内容,我一直想知道。

以下是一个可能的例子:

echo ($something->message ? $something->message : 'no message');

如你所见,如果 $something->message 是正确的,我们返回 $something->message,但为什么要写两次呢?有没有办法做类似的事情:

echo ($something->message ? this : 'no message');

现在我对编程理论并不精通,所以可能有一个原因是前者不能用 "this" 之类的东西来引用,但为什么不呢?这不会简化三元运算符的使用吗?对于像我的示例这样的东西,它非常没用,但假设它是

echo (function(another_function($variable)) ? function(another_function($variable)) : 'false');

我无法找到 任何 方法来做到这一点,所以我假设这是不可能的,如果我错了请通知我,否则:为什么不呢?为什么这不可能,技术原因是什么,或者只是从未发生过的事情?我应该将其声明为变量然后针对该变量进行测试吗?

【问题讨论】:

Does PHP have a default assignment idiom like perl?的可能重复 【参考方案1】:

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

Source

例如

$used_value = function1() ?: $default_value;

$check_value = function1(); //doesn't re-evaluate function1()
if( $check_value ) 
    $used_value = $check_value;
 else 
    $used_value = $default_value;

智者之言

如果您要依赖于TRUE 的类型转换,那么了解什么将类型转换为TRUE 和什么不会,这一点很重要。可能值得复习一下 PHP 的 type juggling 并阅读 type conversion tables。例如(bool)array()FALSE

【讨论】:

提交该补丁的人是我的英雄。我只是在读那一页,似乎直接跳过了那部分。谢谢,也许我应该升级。到时我会接受你的回答! echo ($something->message ? : 'no message'); 在 OP 的第一个示例中。 +1 让 php 用一个晦涩难懂的所有事物的三元运算符实现让你大吃一惊:) 一定要喜欢不协调的地方.. @Kendall wow... :) 我的大多数同事看到三元运算符时都会不高兴。我喜欢让他们尝试找出这些三元变体之一:) 有趣的是,这是 PHP 6 关于 ifsetor() 集思广益的结果(请参阅php.net/~derick/…),虽然它是一个简洁的功能,但它实际上并没有解决原来的问题,因为 $_GET['foo'] ?: '' 如果没有设置仍然会抛出一个通知。

以上是关于关于php 三元运算符的优先级问题。请教?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 三元运算符说明

Javascript 三元运算符的运算符优先级

PHP字符串中的三元运算符

优先级:逻辑或与三元运算符

三元条件和赋值运算符优先级

变量的三元运算符分配优先级