PHP: $a=$b OR $a=$c与三元运算符的区别

3

我希望将两个变量之一赋值给第三个变量,如果第一个变量为(bool)false或未定义,则使用第二个变量的值。

通常我会使用三元符号来完成这个操作,如下所示:

$foobar = ($some_prefix_and_some_variable_name) ? $some_prefix_and_some_variable_name : $bar ; 

但是,如果$foo变量名很长,需要在此表示法中重复使用,这样看起来就不那么美观。

我的问题是,是否可以使用以下表示法:

$foobar = $some_prefix_and_some_variable_name OR $foobar = $bar;

这个符号与三元版本是否可以互换?

如果变量名在像这样的表达式中使用过长,那么该变量名可能总体上也太长了。 - Lightness Races in Orbit
5个回答

7
在PHP 5.3中,还有一种短三元运算符表示法:
$foobar = $fooooooooooooooooooooooooo ?: $bar ;

非常方便,之前不知道,但需要进一步向后支持。 - mikkelbreum
这种表示法非常误导人。 - Lightness Races in Orbit

5
因为$foobar = $foo OR $foobar = $bar;的评估结果如下:
将foo分配给foobar。
*那里有值吗?
   *如果没有,将bar分配给foobar。
而另一个评估结果如下:
foo有值吗?
*如果是,则将foobar = foo
*否则将foobar = bar 在第一个示例中,如果!foo,则会分配两次,如果foo,则可能更快。在第二个示例中,您只设置了一次值总数。不过,我敢打赌速度差异微不足道。
更大的问题在于可读性。如果无法使用5.3短符号,则仍然会使用三元符号表示法,因为其他程序员期望它。
说到这一点,如果人们看到您的代码,他们不会问自己“WTF”,那么您将通过使用传统的三元语法节省更多的时间和金钱。

谢谢,您在此总结了所有答案,并礼貌地详细阐述了为什么它(更快/更慢,一个坏主意等等)。 - mikkelbreum
没问题。我最近意识到,即使不是第一个回答,仔细的回答仍然会受到赞赏。 - cwallenpoole

4
自 PHP 5.3 版本开始,有一个特殊的运算符可以实现此功能:
$foobar = $fooooooooooooooooooooooooo ?: $bar;

自PHP 5.3以来,三元运算符的中间部分可以省略。表达式expr1 ?: expr3如果expr1为真,则返回expr1,否则返回expr3。参考三元运算符的文档

+1(对于链接和摘录)短路逻辑或不以相同的方式运作,有点可惜。愚蠢的设计。 - user166390
@pst:我现在还不理解。据我所知,“OR”行为应该是一样的吧?(不是吗?) - NikiC
不是 PHP :( false or "hello" 会被计算为 true,而不是 "hello"(在 Ruby 和 Python 中会被计算为 "hello",这与语言设计有关)。因此,Ruby 和 Python 的 "or" 就像 PHP 中的 ?:-short 一样工作。 - user166390
@pst:哦,抱歉,我不明白你的意思^^ 是的,你说得对 - 我们都知道PHP并不完美。(好吧,其实离完美还差得远呢。) - NikiC

1

就速度而言,这个:

$foobar = $fooooooooooooooooooooooooo OR $foobar = $bar;

它更快


1
仍然需要逻辑地评估$foooooooo,以及一个赋值操作。我认为这是欺诈行为。 - Captain Giraffe
2
这让我想哭。请不要为了微不足道的微观优化而在表达式中隐藏副作用。 - user166390

0
不行。 我不确定这两种表示法是否可以互换,这意味着你不应该使用第二种!无论它们是否实际上相同,如果代码的作用不是立即明确的(就像在这种情况下),你应该改变它,除非你绝对确定没有人需要更新此代码。如果我看到写成这样,我不确定它是否应该是这样,还是有什么错别字,或者这个bug根本没有被发现(我见过太多类似情况!)。
理想情况下,对于非常长的变量名,你应该这样做:
if($fooooooooooooooooooooooooo){
    $foobar =$fooooooooooooooooooooooooo;
} else {
    $foobar = $bar;
}

为了方便阅读,除非速度至关重要,否则您应该使用三元运算符。


1
我不确定这样阅读起来会更容易 - 每个IF分支的语句结构不同,这使得阅读变得更加困难,在我看来。保持一致。 - user166390
@pst它们的结构相同。这只是为了说明的目的。读取if语句(if(a){x=y} else x=z)比读取形式为(x=y或x=z)的语句更容易。再次强调,这只是一个例子。 - Benubird
我不同意它们结构相同。在 then 中有 { } 和额外的换行符。在 else 中没有。与“统一结构”的情况进行比较:if ($foo) $foo = $bar;\nelse $foo = $quz;if ($foo) {\n $foo = $bar;\n} else {\n $foo = $quz;\n}\n -- 我发现一致性可以极大地帮助编写正确和可维护的代码。 - user166390
1
这不是卖弄学问,而是追求完美主义,在程序员身上这是一个非常好的特质...就像pst本人所说的那样。没有懒惰的借口。 - Lightness Races in Orbit

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