0

我已经仔细阅读了关于三元运算符if/else 结构的问题,虽然我知道在正常情况下,在 if/else 结构上使用三元运算符没有性能损失/增益,但我没有看到任何提及这一点情况。特定于 PHP 的语言(但欢迎任何与语言无关的细节)解释器会在以下情况下重新分配值:

$foo = 'bar'
$foo = strlen($foo) > 3 ? substr($foo, 0, 3) : $foo;

由于这将评估为$foo = $foo;效率低下,还是解释器只是忽略/丢弃此评估?

在旁注中,关于:

!defined('SECURE') ? exit : null;
4

4 回答 4

4

我不知道您的第一个示例是否效率低下,但这肯定是毫无意义的。我仍然认为 if 语句更清晰:

$foo = 'bar';

if (strlen($foo) > 3)
    $foo = substr($foo, 0, 3);

虽然以下内容有效,但放在最后是没有意义的,null因为三元运算符旨在用于评估表达式/值,但这里null除了防止解析错误之外什么也没做:

!defined('SECURE') ? exit : null;

更常见的是,您会看到一个布尔短路示例(如果未定义,or exit则不会执行,因为一旦发现至少一个条件为真,条件表达式就会自动计算为真):SECUREor

defined('SECURE') or exit;

我要说明的一点是:不要仅仅因为可以就使用三元条件表达式。

于 2011-01-09T20:50:25.657 回答
0

在这种情况下,我使用 BoltClock 提供的形式:

if (strlen($foo) > 3) {
    $foo = substr($foo, 0, 3);
}

在这种情况下,PHP 并没有实现更简单的工作:/

于 2011-01-09T21:11:31.583 回答
0

上面已经讨论了在这里使用三元不是最佳的主题。我将解决您关于它是否会重新分配值的问题:

这取决于您所说的“重新分配”。PHP 没有优化,所以$foo = $foo会被评估。另一方面,这不会导致 PHP 将 的值复制$foo到新的内存块中。可能 PHP 只会增加refcounton$foo然后立即减少它(尽管我不确定自分配的确切实现细节)。因此,即使 PHP 会执行该语句,它也不会影响性能(除非您选择$foo = $foo在代码中编写 700 万次)。

于 2011-01-09T21:25:35.940 回答
0

总是存在短路,尽管正如@BoltClock 所说,在我看来,声明可能更具可读性,并且也if为条件打开了大门。else ifelse

strlen($foo) > 3 && $foo = substr($foo, 0, 3); 

只有当前者的计算结果为 TRUE 时,才会执行后一个语句。

于 2011-01-09T21:38:08.210 回答