PHP三元运算符澄清

11

我经常使用三元运算符,但在文档中找不到任何关于此的信息,一直很好奇。

以下是一个可能的例子:

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?的重复问题。 - outis
1个回答

19
自 PHP 5.3 开始,可以省略三元运算符的中间部分。表达式 expr1 ?: expr3 如果 expr1 为 TRUE,则返回 expr1,否则返回 expr3。 来源 例如:
$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,什么不会转换为TRUE是很重要的。值得一提的是,了解一下PHP的type juggling和阅读type conversion tables可能是值得的。例如,(bool)array()FALSE


1
谁提交了那个补丁,他是我的英雄。我刚刚在阅读那个页面时似乎直接跳过了那部分。谢谢,也许我应该升级一下。时间限制到期时,我会接受你的答案! - sam
在 OP 的第一个示例中,翻译后的代码为:echo ($something->message ? : '没有消息'); - Peter Ajtai
1
留给PHP去惊喜你,用所有东西中最模糊的三元运算符实现它 :) 必须喜欢这些不协调之处... - Doug T.
@Kendall 哇... :) 嗯,当我的大多数同事看到三元运算符时,他们都会变得脾气暴躁。我非常愿意让他们试着弄清楚其中一种三元变体 :) - Doug T.
有趣的是,这是 PHP 6 关于 ifsetor() 的头脑风暴的结果(请参见 http://www.php.net/~derick/meeting-notes.html#ifsetor-as-replacement-for-foo-isset-foo-foo-something-else),虽然它是一个很好的功能,但它实际上并没有解决原始问题,因为 $_GET['foo'] ?: '' 如果未设置仍会抛出一个通知。 - user69173

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接