Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 避免在复杂的if/else语句中重复代码_Php - Fatal编程技术网

Php 避免在复杂的if/else语句中重复代码

Php 避免在复杂的if/else语句中重复代码,php,Php,我经常遇到这个问题:您有一系列的if/else语句,其中预期的结果可能来自两个完全不同的分支,最终您会在这两个分支上复制代码。下面是一个例子: if (condition1) { return error } else { if (condition2) { return intendedResult } else { if (condition3) { return error } else {

我经常遇到这个问题:您有一系列的
if/else
语句,其中预期的结果可能来自两个完全不同的分支,最终您会在这两个分支上复制代码。下面是一个例子:

if (condition1) {
    return error
} else {
    if (condition2) {
        return intendedResult
    } else {
        if (condition3) {
            return error
        } else {
            return intendedResult
        }
    }
}
目前我在一个PHP脚本中遇到了这个问题,预期的结果是大约200行PHP查询、HTML和附加的
if/else
语句。这是您应该何时使用函数的主要示例吗?然后
返回
连接字符串中的所有代码

编辑:

谢谢你的回复。我可以看出我的逻辑需要整理一下。如果我给你一个真实的例子,你能帮我重新构建我的逻辑吗?我认为这比我的伪代码要复杂一点

我从数据库中提取两个日期,
$lift\u deadline
$show\u guide\u close
,根据今天的日期与这些日期的关系,执行以下操作:

if ($lift_deadline > $today) {
    echo "No access until " . $lift_deadline;
} else {
    if ($lift_deadline !== "0000-00-00") {
        if ($today > $show_guide_close) {
            $use_date = $show_guide_close;
        } else {
            $use_date = $lift_deadline;
        }
        echo "HTML Table"; // Intended result goes here, using $use_date
    } else {
        if ($show_guide_close > $today) {
            echo "No access until " . $show_guide_close;
        } else {
            $use_date = $show_guide_close;
            echo "HTML Table"; // Intended result also goes here
        }
    }
}

是的,函数是简化代码并使其更易于阅读的一种方法。它可能也值得研究和使用。

是的,函数是简化代码并使其更易于阅读的一种方法。它可能也值得研究和使用。

在简单的例子中,我使用switch语句来处理类似的内容

switch(true)
{
    case (condition1):

        break;
    case (condition2):

        break;
    default:

}

在简单的例子中,我使用switch语句来处理类似的内容

switch(true)
{
    case (condition1):

        break;
    case (condition2):

        break;
    default:

}

当然,解决方案的一部分是将
intentidedResult
编码成一个单独的方法,但只需重新组织条件就可以帮助:

if ($condition1) {
    return 'error';
}
if (!$condition2 && $condition3) {
    return 'error';
}
return $this->intendedResult();
这可以进一步简化为:

return ($condition1 || $condition3) ? 'error' : $this->intendedResult();

但这可能不那么易读,也不能真正说明我的观点,正如Tom提到的,将控制结构展平是解决方案的一部分,当然是将
intentidedResult
代码变成一个单独的方法,但只要重新组织条件就可以帮助:

if ($condition1) {
    return 'error';
}
if (!$condition2 && $condition3) {
    return 'error';
}
return $this->intendedResult();
这可以进一步简化为:

return ($condition1 || $condition3) ? 'error' : $this->intendedResult();

但这可能不那么易读,也不能真正说明我的观点,正如Tom提到的,将控制结构扁平化

您提供的代码并不复杂。如果(条件1 | |条件3){return error}或者{return intendedResult}是的,intendedResult应该是一个函数,那么它可以这样编写!错误也应该如此!应该是
if(condition1 | |(!condition2&&condition3)){return error}else{return intendedResult}
您提供的代码并不复杂。如果(条件1 | |条件3){return error}或者{return intendedResult}是的,intendedResult应该是一个函数,那么它可以这样编写!错误也应该如此!应该是
if(condition1 | |(!condition2&&condition3)){return error}或者{return intentendedresult}
对我来说,在
return$returnVar
之前的函数中,无尽的
$returnVar.=…
感觉不正确…函数应该是简短的。您应该以函数为目标,以便在函数末尾只有一个返回。使用对象/类和函数几乎会自动改变你的代码结构和条件,并且更具可读性。但对我来说,在返回$returnVar之前,函数内部无休止的
$returnVar.=…
让人感觉不对劲…函数应该是短而快的。您应该以函数为目标,以便在函数末尾只有一个返回。使用对象/类和函数几乎会自动改变您构建代码和条件的方式,并且更具可读性。请告诉我,因此我将在此处放置我的rational:由于返回结束了流程流,您可以通过在返回错误(或引发异常)时放置检查来平坦您的逻辑在你函数的顶部。请告诉我,我将把我的rational放在这里:因为返回结束了流程流,所以你可以通过在你函数的顶部放置返回错误(或抛出异常)时的检查来平坦你的逻辑。