這是一個普遍的排序問題,但解釋它我會用一個具體的例子。PHP短路評估(好/壞?)
我有一個加載文檔的函數。如果該文檔不存在,它將創建它,如果它存在,它會將其轉換爲JSON數組。我總是希望這個函數返回一個某種類型的數組,無論json_decode()
是否存在問題,或者文件不存在。目前,我做這件事是這樣的...
function load($file) {
if(! file_exists($file)) {
$handle = fopen($file, 'w');
fclose($handle);
}
$raw = file_get_contents($file);
$contents = json_decode($raw, TRUE);
return(! $contents ? array() : $contents);
//cant use ternary shorthand "?:" in PHP 5.2, otherwise this would be shorter
}
現在,有沒有錯,上面的代碼(至少我不覺得有什麼,它工作正常)。不過,我一直在尋找方法來改善我的代碼並在保持完美清晰的同時對其進行壓縮。這個迴歸聲明一直困擾着我,因爲它看起來效率很低。所以今天我開始思考和發生了一些事情。我記得看到mysql教程做了一些connect() or die();
的效果,所以我想,爲什麼不json_decode() or array();
?這甚至會工作嗎?所以我重寫了我的功能找出...
function load($file) {
if(! file_exists($file)) {
$handle = fopen($file, 'w');
fclose($handle);
}
$raw = file_get_contents($file);
return json_decode($raw, TRUE) or array();
}
它似乎,它甚至讀取愉快足夠。因此,我的下一輪問題。這是好的做法嗎?我明白,但是會有其他人嗎?它真的有效嗎?或者這是一個有一個快樂結局的錯誤?我得四處看看,發現我問的是短路評估,而不是一個錯誤。這很好知道。我用這個新術語來改進我的搜索,並提出了一些更多的材料。
沒有太多,我發現大多數的一切,談到了我詢問總是提到的MySQL連接的方式使用短路。現在,我知道大多數人反對使用術語,但僅僅是因爲它是處理錯誤的一種不雅的方式。這不是我詢問的方法的問題,因爲我不打算使用or die()
。有沒有其他的理由不使用它?維基百科似乎認爲是這樣,但只是參考C.我知道PHP是用C編寫的,所以這是絕對有用的信息。但是這個問題在PHP編譯中已經出現了嗎?如果不是這樣,它和維基百科一樣糟糕嗎?
這是維基百科的片段。 「短路會導致現代處理器的分支預測出現錯誤,並且會大大降低性能(一個值得注意的例子是高度優化的射線跟蹤中與軸對齊的盒子相交代碼的光線)[需要澄清]。一些編譯器可以檢測到這種情況併發出更快的代碼,但由於可能違反C標準,並不總是可能的。高度優化的代碼應該使用其他方式來執行此操作(如手動使用匯編代碼)「
什麼你們都在想嗎?
編輯
我調查的另一個論壇,並得到了一些好成績出現。普遍的共識似乎是,這種形式的變量賦值雖然有效,但並不是首選,甚至可能被認爲是現實世界中的不良形式。我會繼續留心,如果有新事物出現,我會更新它。感謝Corbin和Matt提供的信息,尤其是Corbin爲了解決一些問題。 Here的鏈接到論壇帖子,如果你有興趣。
@DaveRandom反對php的人的典型答案 – Matt
在您的原始返回聲明中,爲什麼要烘焙消極? '返回$內容? $ contents:array();'。也不需要父母。 – Madbreaks
@Madbreaks:這實際上是從我之前刪除的一個條件。它最初看起來像'return(!isset($ contents)||!$ contents?array():$ contents);'這可能會讓我更加明白爲什麼它是這樣的,我只是忽略了在我休息時重新定位改變了它。 – mseancole