9

我发现有很多 if-else 语句,尤其是嵌套的 if else 语句,这些语句使我的代码可读性降低。如何减少 PHP 中 if else 语句的数量?

我的提示如下: 1.在合适的时候使用switch语句;2.在可行的情况下使用exit()语句;3、在可行的情况下使用三元语句;

是否有其他技巧可以减少 if else 语句,尤其是嵌套的 if-else 语句?

4

7 回答 7

22

尽可能使用“提前返回”以减少嵌套深度。尝试使用布尔表达式评估。

例子:

function foo($param)
{
    $ret = false;

    if(userIsLoggedIn()) {
        if(is_array($param)) {
            if($param['count'] > 0) {
                $ret = true;
            }
            else {
                $ret = false;
            }
        }        
    }

    return $ret;
}

你可以这样重写:

function foo($param) 
{
    if(!userIsLoggedIn()) return false;
    if(!is_array($param)) return false;
    return $param['count'] > 0;
}
于 2009-11-26T15:21:07.640 回答
21

将您的代码重构为更小的工作单元。太多的条件逻辑是代码异味,通常表明您的函数需要重构。

于 2009-11-26T15:08:09.060 回答
11

有一种官方学术方法可以重构和简化很多if条件,称为卡诺映射

它接受多个测试条件并尝试帮助创建if涵盖所有必需案例的简化语句。

您可以在此处从 wiki 了解更多信息。

于 2011-09-30T02:20:58.417 回答
3

使用三元运算符,重构代码,编写一个函数或一个类来执行所有必要的 if else 语句。

于 2009-11-26T15:11:16.490 回答
3

我编写了大量的代码,这些代码充满了不断发展的业务逻辑,并且需要每隔一天修改一次。肯定有助于我跟上修改的两个技巧是:避免所有其他语句并尽快返回/退出。永远不要深入嵌套 -> 创建子例程/函数。

用否定的 if 语句替换所有 else 语句使您的代码更容易从上到下阅读(条件和代码块的接近度):

# business logic block
if ( $condition ) {
    # do something
    # code code code
} else {
    # code code code
    return;
}

# refactored:
if ( ! $contition ) {
    # code code code
    return;
}
if ( $condition ) {
    # code code code 
}

其次,尽快返回/退出。我的意见当然是,但是当您已经确定子例程的结果时,尤其是当您想从上到下阅读代码时,我看不出运行任何额外条件/测试的意义。消除所有歧义使事情变得更简单。

总而言之,我喜欢避免使用 else,尤其是在长长的 BL 列表中。知道结果后立即返回。如果嵌套级别大于 2,则创建子例程/函数。

于 2011-10-01T15:41:53.500 回答
1

多态性也可以摆脱一些,尽管很难实现减少 PHP 中的 if/else,因为它不是类型安全的......

于 2009-11-26T15:20:42.060 回答
0

ternary operator您可以使用或null coalescing operator这样减少 if/else 代码的数量:

使用三元运算符: Variable = (Condition) ? (Statement1) : (Statement2);

$age = 20;
  print ($age >= 18) ? "Adult" : "Not Adult";

输出: Adult

通过使用空合并运算符:

// fetch the value of $_GET['user'] and returns 'not passed'
   // if username is not passed
   $username = $_GET['username'] ?? 'not passed';
   print($username);
   print("<br/>");

   // Equivalent code using ternary operator
   $username = isset($_GET['username']) ? $_GET['username'] : 'not passed';
   print($username);
   print("<br/>");
   // Chaining ?? operation
   $username = $_GET['username'] ?? $_POST['username'] ?? 'not passed';
   print($username);

输出:

not passed 
not passed 
not passed 
于 2022-02-15T06:35:49.310 回答