2011-01-09 162 views
0
变量再分配

我细读上三元运营商问题的if/else结构,虽然我明白,在正常情况下有使用三元运营商能够在不损失性能/增益如果/其他结构,我还没有看到这种情况。语言具体到PHP(但任何语言无关的细节,欢迎),并解释重新分配值的情况是这样的:三元运营商和PHP

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

因为这将评估为$foo = $foo;这是低效的,或不解释简单地忽略/丢弃这个评价?

在一个侧面说明,关于什么:

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

我的脸从引用我的答案的数量变红。 – BoltClock 2011-01-09 21:40:38

回答

4

我不知道,如果你的第一个例子是低效率的,但可以肯定的是毫无意义的。我始终认为一个if语句是清晰的:

$foo = 'bar'; 

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

虽然下面的作品,它是没有意义的,在尾部的null因为三元经营者是指被用来计算表达式/值,但在这里null什么都不做除了防止解析错误:

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

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

defined('SECURE') or exit; 

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

+0

谢谢** BoltClock **;它当然更清晰。我一直想知道为什么在这种情况下使用三元运算符时第三个表达式是必需的。也许我一个人,但`$ foo = strlen($ foo)> 3? substr($ foo,0,3);`对我来说看起来很可读。布尔短路将再次成为答案,对吗? – Dan 2011-01-09 20:55:44

+0

@TomcatExodus:大多数人都会为“死亡”线路预留短路。听起来就像一个真实的死亡威胁:) – BoltClock 2011-01-09 21:00:29

0

在这种情况下,我用BoltClock形式呈现:

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

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

0

,这里使用的三元主题以上已经不是最优的。我将解决您是否会重新分配数值的问题:

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

0

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

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

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