【问题标题】:php: $a=$b OR $a=$c vs. ternaryphp: $a=$b OR $a=$c vs. 三元
【发布时间】:2011-09-16 17:10:14
【问题描述】:

我需要将两个变量之一分配给第三个变量,如果第一个是 (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;

这种表示法可以与三元版本互换吗?

【问题讨论】:

  • 如果变量名太长而不能与这样的表达式一起使用,那么变量名可能就太长了。

标签: php variable-assignment ternary-operator boolean-logic assignment-operator


【解决方案1】:

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

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

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

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

【讨论】:

  • 我不确定这应该如何更容易阅读——每个 IF 分支的语句 结构不同 这使得它 更难阅读,IMOHO。保持一致。
  • @pst 它们的结构相同。这只是为了说明的目的。阅读 if 语句 (if(a){x=y} else x=z) 比阅读形式为 (x=y 或 x=z) 的语句更容易。同样,只是一个例子。
  • 我不同意它们的结构相同。在then 中有{ } 和额外的新行。在else 中两者都没有。与“结构统一”的案例比较:if ($foo) $foo = $bar;\nelse $foo = $quz;if ($foo) {\n $foo = $bar;\n} else {\n $foo = $quz;\n}\n——我发现 一致性 可以帮助编写正确且可维护的代码。
  • 这不是迂腐;这是完美主义,对于程序员来说,这是一个该死的好特质……出于 pst 自己给出的原因。没有理由懒惰。
【解决方案2】:

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

$foobar = $fooooooooooooooooooooooooo ?: $bar;

来自documentation on the ternary operator

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

【讨论】:

  • +1(对于链接和摘录)有点遗憾的是,短路逻辑 OR 的行为方式不同。愚蠢的设计。
  • @pst:我现在不明白。据我所知,OR 的行为是一样的。 (不是吗?)
  • PHP 中没有 :( false or "hello" 计算结果为 true,而不是 "hello"(例如,在 Ruby 和 Python 中计算结果为 "hello",并且与语言设计有关) . Ruby 和 Python 的“或”因此在 PHP 中的工作方式类似于 ?:-short。
  • @pst:哦,抱歉,我不明白你的意思 ^^ 是的,你是对的——我们都知道 PHP 并不完美。 (嗯,好吧,甚至还不够完美。)
【解决方案3】:

因为$foobar = $foo OR $foobar = $bar; 的计算结果如下:

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

而另一个评估为:

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

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

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

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

【讨论】:

  • 谢谢,您在这里总结了所有答案,并礼貌地详细说明了原因(更快/更慢,一个坏主意等)。
  • 没问题。我最近意识到,即使不是第一个,详尽的答案仍然会受到赞赏。
【解决方案4】:

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

$foobar = $fooooooooooooooooooooooooo ?: $bar ;

【讨论】:

  • 蛮好用的,不知道,不过需要再往后支持一点。
  • 这个符号太误导人了。
【解决方案5】:

在速度方面,这个:

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

更快

【讨论】:

  • 逻辑上仍然需要评估$foooooooo,以及一个作业。我称之为恶作剧。
  • 这让我想哭。请不要在 EXPRESSIONS 中隐藏副作用以进行微不足道的微优化。
猜你喜欢
  • 2018-01-29
  • 2017-01-11
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 2015-12-31
  • 2015-11-20
相关资源
最近更新 更多