2010-05-11 39 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和设计模式。