许多if语句的最合理的结构是什么?

时间:2013-07-20 15:12:55

标签: php language-agnostic coding-style

我目前正在使用PHP创建一个简单的登录脚本,并且成功登录时必须满足许多条件。据我所知,有两种方法可以格式化所需的if语句。

第一种方法是使用嵌套的if语句:

if ($condition1 == true) {
    if ($condition2 == true) {
        if ($condition3 == true) {
            //Successful login
        } else {

        }
    } else {

    }
}

第二种方法是使用过程if语句:

if ($condition1 != true) {
    die("error");
}
if ($condition2 != true) {
    die("error");
}
if ($condition3 != true) {
    die("error");
}

//successful login

处理许多条件的两种方法中哪一种更合乎逻辑?我还没有列出哪些更好,更合理的方法吗?

3 个答案:

答案 0 :(得分:3)

在这种情况下,它并不重要,除非您想向用户显示您遇到的所有错误。

例如,您可以这样做:

if($condition1 != true) {
    if($condition2 != true) {
        if($condition3 != true) {
            // Success! Login now...
        } else {
            die(error3);
        }
    } else {
        die(error2);
    }
} else {
    die(error1);
}

在这种情况下,用户将被强制修复出现的错误。这可能需要更多时间,但更容易理解。

if ($condition1 != true) {
    $error = 'Error 1';
}
if ($condition2 != true) {
    $error .= 'Error 2';
}
if ($condition3 != true) {
    $error .= 'Error 3';
}

if($error != '') {
    die($error);
} else {
    // Success! Login now...
}

在这种情况下,用户将同时看到所有错误,并且他或她将能够在再次提交表单之前修复所有错误,但更多信息总是难以理解。

更新

约翰说的是对的。

在下面的某个地方,靠近登录表单和输入,您可以制作如下的PHP代码:

<?php if($error != '') { ?><p style="color:red;"><?php echo $error; ?></p><?php } ?>

显然,您需要使用上面显示的代码来防止服务器在发现错误时尝试登录。

希望这会有所帮助......

答案 1 :(得分:1)

我会做这样的事情:

if(!(condition1)){
    $ok = false;
}
if(!(condition2)){
    $ok = false;
}
if(!(condition3)){
    $ok = false;
}

if($ok){
    //if they got here, they must have passed all the tests!
}

可缩短为:

if( !(condition3) || !(condition2) || !(condition3)  ){
    echo "Success!";
}

来自您的评论:

  

如果满足“$ condition3”,但“$ condition4”不符合?

您可以使用以下内容:

if( (condition1) && !(condition4) ) {
echo "Hurray! Condition 1 was satisified but condition 4 failed :(";
}

答案 2 :(得分:0)

这对我来说更符合逻辑。因为它在一个语句中表示“登录决策的逻辑”,如果逻辑将变得更加混乱,它仍然是最可读的

if (($condition1 == true) 
    && ($condition2 == true)
    && ($condition3 == true)
    && ($condition4 == true)
    && ($condition5 == true)