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;

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

4

5 回答 5

7

在 PHP 5.3 中也有简短的三进制表示法:

$foobar = $fooooooooooooooooooooooooo ?: $bar ;
于 2011-06-16T20:31:28.300 回答
5

因为$foobar = $foo OR $foobar = $bar;评估为:

将 foo 分配给 foobar。
* 那里有价值吗?
   * 如果不是,则将 bar 分配给 foobar。

而另一个评估为:

foo 有值吗?
* 如果是这样分配 foobar = foo
* 否则分配 foobar = bar

在第一个示例中,如果 !foo 你分配了两次,如果 foo 它可以更快。在第二个示例中,您只设置了一次总计值。我敢打赌,速度差异可以忽略不计。

这里更大的问题是可读性。如果 5.3 短符号不可用,那么我仍然会使用三进制符号,因为其他程序员期望它。

就此而言,您将通过使用传统的三元语法节省更多时间和金钱,因为当人们看到您的代码时他们不会问自己,WTF?

于 2011-06-16T20:35:47.877 回答
4

从 PHP 5.3 开始,有一个特殊的运算符:

$foobar = $fooooooooooooooooooooooooo ?: $bar;

有关三元运算符的文档中

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

于 2011-06-16T20:32:20.753 回答
1

就速度而言,这是:

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

它更快

于 2011-06-16T20:30:37.267 回答
0

不,我不确定这两个符号是否可以互换,这意味着你不应该使用第二个!无论它们实际上是否相同,如果不能立即清楚代码的作用(如本例所示),您应该更改它,除非您绝对确定没有其他人需要更新此代码。如果我看到这样写,我不确定它是否应该是这样,或者是否有一些错字,而且这个错误根本就没有被发现(见过太多次了!)。

理想情况下,如果变量名很长,您应该这样做:

if($fooooooooooooooooooooooooo){
    $foobar =$fooooooooooooooooooooooooo;
} else {
    $foobar = $bar;
}

只是为了使其易于阅读,除非速度至关重要,在这种情况下您应该使用三元运算符。

于 2011-06-16T20:32:54.613 回答