处理PHP中的大型IF语句

时间:2010-05-11 19:19:05

标签: php if-statement

PHP中的普通if语句有什么好的替代方法吗?我知道switch,但我猜想在使用非常大的if语句时,有一些更精确的替代方案可以派上用场。

非常感谢,

6 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:5)

那里真的没有魔法锤。让它们易于管理的最好方法是将嵌套的ifs分解为它们自己的函数,以使它们更具可读性。

另外,不要忘记array_filter。这可以使您不必编写for循环来过滤掉项目。

此外,您可以使用guard statements来消除嵌套。你基本上反转你的if而不是return(将条件分解为函数的另一个原因)。

答案 2 :(得分: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') {}

显然,这些都是简化的例子,但你明白了......

答案 3 :(得分: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();

答案 4 :(得分:1)

ifif,其他地方没有多少。当然switch是另一种选择,但根据条件可能不适用。

如果您正在进行OOP,state design pattern可能就是您所需要的。

否则你必须提供更多信息......

答案 5 :(得分:1)

如果“大”意味着大而高度嵌套的“ifs”,这是代码气味的明显标志,你应该看看OOP和设计模式。