对于许多 if 语句来说,最合乎逻辑的结构是什么?

What is the most logical structure for many if statements?

提问人:Sosumi 提问时间:7/20/2013 更新时间:7/20/2013 访问量:157

问:

我目前正在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

处理许多条件的两种方法中哪一种被认为更合乎逻辑?有没有其他我没有在这里列出的更好、更合乎逻辑的方法?

与PHP 语言无关 编码风格

评论

3赞 John V. 7/20/2013
与实际问题无关,但仍然很重要:永远不要使用骰子作为给用户的实际错误消息,总有更好的方法来显示他们填写了错误的表单。
0赞 Sosumi 7/20/2013
是的,这只是一个简单的例子来说明我的问题。我希望人们不要试图从我的 Stack Overflow 示例中学习 PHP......

答:

0赞 Jarek.D 7/20/2013 #1

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

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

评论

3赞 Sosumi 7/20/2013
那行得通;但是,如果满足“$condition 3”,但不满足“$condition 4”,则需要执行什么操作?我想这种方法失去了该功能。
0赞 Jarek.D 7/20/2013
在这种情况下,顺序方法是唯一的方法。或者更面向对象的方法 - 使条件成为类等
3赞 Timbo_KZ 7/20/2013 #2

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

例如,您可以执行以下操作:

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 } ?>

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

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

评论

2赞 Herbert 7/20/2013
就个人而言,我更愿意一次看到所有错误。修复一个错误,然后得到另一个错误有点烦人。这太像调试了。
1赞 Amal Murali 7/20/2013 #3

我会做这样的事情:

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!";
}

从您的评论中:

如果满足“$condition 3”,但不符合“$condition 4”怎么办?

您可以使用如下内容:

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