PHP中的普通if
语句有什么好的替代方法吗?我知道switch
,但我猜想在使用非常大的if
语句时,有一些更精确的替代方案可以派上用场。
非常感谢,
答案 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)
if
好if
,其他地方没有多少。当然switch
是另一种选择,但根据条件可能不适用。
如果您正在进行OOP,state design pattern可能就是您所需要的。
否则你必须提供更多信息......
答案 5 :(得分:1)
如果“大”意味着大而高度嵌套的“ifs”,这是代码气味的明显标志,你应该看看OOP和设计模式。