2010-05-11 40 views
1

PHP中的普通if語句有什麼好的選擇嗎?我知道switch,但我猜測有一些更精確的替代方法,在使用真正大的if語句時非常方便。處理PHP中的大IF語句

非常感謝,

+0

你的if語句有多大?有可能它們可以被簡化,並且取決於你正在處理的邏輯類型,可能有其他選擇。不過,如果你發佈了一些有洞察力的代碼。 – 2010-05-11 19:21:21

+0

將其分解爲一個函數。 – kennytm 2010-05-11 19:21:52

+0

不完全確定你的意思。就像紅寶石的'除非'? – 2010-05-11 19:22:16

回答

4

如果你想提高可讀性而已,那麼你可以隨時分手if語句裏面的表達式:

$exp1 = is_array($var) && isset($var['key']); 
$exp2 = is_object($var) && isset($var->key); 
$exp3 = substr($string, 0, 4) == 'foo'; 
$exp4 = ($exp1 || $exp2) && $exp3; 
if ($exp4) {} 

,而不是

if (((is_array($var) && isset($var['key'])) || (is_object($var) && isset($var->key))) && substr($string, 0, 4) == 'foo') {} 

顯然,這是簡化的例子,但你這個想法...

+0

我見過很多表達式,跨越多行。這是提高可讀性的好方法! – 2010-05-11 22:41:17

5

那裏確實沒有魔術錘。讓他們易於管理的最好方法是將嵌套的ifs分解爲自己的函數,使其更具可讀性。

此外,請不要忘記array_filter。這可以讓你不必編寫for循環來過濾項目。

此外,您可以通過使用guard statements來消除嵌套。你基本上反過來,如果做一個return而不是(將條件分解成函數的另一個原因)。

1

那麼ifif,那裏沒有其他的東西了。當然switch是一種替代方案,但取決於它可能不適用的條件。

如果你正在做OOP,state design pattern可能是你所需要的。

否則,您必須提供更多的信息.​​..

11

如果你不能在一個屏幕上閱讀折你的算法,有你需要重構你的代碼朝着更可讀性99.9%的機會。

變化

if ($isHappening) { 
    // ... millions of lines of code 
} else { 
    // .. another million lines of code 
} 

if ($isHappening) { 
    happen(); 
} else { 
    didntHappen(); 
} 

function happen() { 
    // millions of lines of code 
} 

function didntHappen() { 
    // another million lines of code 
} 
3

歡迎面向對象:)

class Case1 { 
    function do() { echo "case 1"; } 
} 

class Case2 { 
    function do() { echo "case 2"; } 
} 


$object = new Case1(); 

$object->do(); 

的世界,然後,有一個使用數組調度:

$choices = array("case1" => new Case1(), "case2" => new Case2(), ...); 

$choices[ $_GET["case"] ]->do(); 
+2

一個巧妙的訣竅,但可能與OO濫用有關。 – 2010-05-11 19:47:57

+3

@xtofl所倡導的是多態的智能用法。顯然,這是一個過分簡化的情況,但是使用多態性來重構複雜的if語句是實體OO設計的一部分。 – 2010-05-11 19:57:07

+1

我可以爲此擔保。經過OOP一段時間後,冗長,複雜的if語句對我來說是陌生的。現在一切都變得更短,更簡單。 – 2010-05-12 00:18:41

1

如果「大」,你的意思是大,高度嵌套的「ifs」,這是一個明顯的代碼氣味的跡象,你應該看OOP和設計模式。