PHP中的三元运算符和变量重新赋值

时间:2011-01-09 20:46:37

标签: php ternary-operator

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

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

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

旁注,如何:

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

4 个答案:

答案 0 :(得分:4)

我不知道你的第一个例子是否效率低下,但肯定没有意义。我仍然认为if语句更清楚:

$foo = 'bar';

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

虽然以下有效,但将null放在最后是没有意义的,因为三元运算符用于评估表达式/值,但此处null除此之外什么都不做防止解析错误:

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

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

defined('SECURE') or exit;

我想说的是:不要因为你可以使用三元条件表达式。

答案 1 :(得分:0)

在这种情况下,我使用BoltClock提供的表格:

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

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

答案 2 :(得分:0)

上面已经介绍了在这里使用三元不是最优的主题。我将解决你是否会重新分配价值的问题:

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

答案 3 :(得分:0)

总有短路,虽然正如@BoltClock所说,if声明在我看来可能更具可读性,并打开else ifelse条件的大门

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

后一种语句只有在前者评估为TRUE时才会执行。