2011-01-09 161 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時纔會執行後面的語句。