0

有时主要是为了处理用户输入,我发现自己使用了很多相互嵌套的 IF 语句,有时它比下面要多得多,以至于它从屏幕左侧的 if 到屏幕右侧的 if 数字 10 .

这很难阅读和排除故障,还有其他方法可以嵌套 if 吗?

我知道 switch() 但是在这种情况下,我必须在第三个而不是第一个进行查询。

if (true) {

  if (true) {

     if (true) {
        ...
        echo "You are logged in";
     } else {
        echo "login failed"
     }

  } else {
     echo "incorrect email";
  }

}
4

4 回答 4

7

我假设您的true条件是真实条件,而不仅仅是true布尔常数。

if (condition1 && condition2 && condition3) {
    echo "You are logged in";
} else {
    echo "login failed";
}

如果您需要单独处理的条件:

if (emailAddressIsCorrect) {
  if (condition2 && condition3) {
    echo "You are logged in";
  } else {
    echo "login failed";
} else {
 echo "incorrect email";
}

或者你可以早点回来,我认为这更干净。如果您愿意,您可以针对每种情况执行此操作。通过这种安排,您可以拥有任意数量的条件,而无需条件嵌套:

if (!emailAddressIsCorrect) {
  echo "incorrect email";
  return;
}
于 2013-05-08T20:25:53.943 回答
1

很多时候我会改用“失败”策略:

function login() {
    if (!condition1) {
        echo "incorrect email";
        return false;
    }

    if(!condition2) {
        echo "incorrect password";
        return false;
    }

    if(condition3) {
       echo "logged in successfully!";
       return true;
    }

    return false;
}

这个例子是可疑的,让攻击者知道登录失败的部分存在安全问题,但作为代码片段,您可以看到该策略。

于 2013-05-08T20:30:02.543 回答
0

使用“&&”组合 2 个 if 语句。

或者

有时使用面向对象编程可以避免 if 语句:

if(is type a) {
   dostuff1();
} else if(is type b) {
   dostuff2();
}

使用类和继承:

 class->dostuff();

您还可以使用“第一类函数”来避免 if 语句。

假设您有值 $_POST['page'] == 'page1', $_POST['page'] == 'page2'

$functions = array("page1"=>$function1, "page2"=>$function2);

function dostuff1() {
return 'a';
}
function dostuff2() {
return 'b';
}

$function1 = "dostuff1";
$function2 = "dostuff2";

$functions[$_POST['page']](); 

代替

if($_POST['page'] == '1') dostuff1(); 

等等……虽然这个方法有点吓人……哈哈

于 2013-05-08T20:32:46.770 回答
0

比较一下:

if ($true1) {
   if ($true2) {
      if ($true3) {
         ...

有了这个:

if ($true1 && $true2 && $true3) {
   ...
}

使用第一种方法不仅浪费了单个的有用空间IF
而且还延迟了不可避免的事情:稍后进行优化

此外,如果您将as 嵌套或 放在一行中 ,它也没有关系(等性能),因为如果 PHP 解释器发现FALSE将停止检查。IFs

于 2013-05-08T20:44:32.323 回答