2010-08-27 72 views
11

我经常使用三元运算符,但我一直无法找到关于此的文档中的任何内容,我一直在想它。PHP三元运算符澄清

下面是一个可能的例子:

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

,你可以看到,如果$ something->消息是正确的,我们返回$ something->消息,但为什么要写两次?有没有办法做这样的事情:

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

现在,我没有很好地规划理论精通,所以它可能有一个原因,前者不能与一些引用像“本”,但为什么不?这不会流三线运算符的使用吗?对于像我的例子这是很没用,但是让我们说这是

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

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

+0

可能的重复[是否PHP有默认的分配习惯像perl?](http://stackoverflow.com/questions/2958630/does-php-have-a-default-assignment-idiom-like-perl) – outis 2012-04-01 05:45:06

回答

19

从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

+1

提交该补丁的人是我的英雄。我刚刚阅读该页面,似乎直接跳过该部分。谢谢,也许我应该升级。当时间到了,我会接受你的回答! – sam 2010-08-27 00:14:09

+0

'echo($ something-> message?:'no message');'在OP的第一个例子中。 – 2010-08-27 00:14:10

+1

+1让它给你一个三元运算符的所有事情的晦涩难懂的执行情况让你感到惊讶:)得爱不协调.. – 2010-08-27 00:16:56