2012-08-07 173 views
11

我想知道当它是一个坏主意使用多个嵌套的IF语句。PHP - 嵌套的IF语句

如:

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if($email && $password && $new_password && $confirm_new_password) 
    { 
     if($new_password == $confirm_new_password) 
     { 
      if(login($email, $password)) 
      { 
       if(set_password($email, $new_password)) 
       { 
        return TRUE; 
       } 
      } 
     } 
    } 
}  

该功能用于这样的:

​​

我把我所有的功能这样的,我想知道如果有什么问题我的编码风格。我有我的疑惑,因为如果我遵循这个设计,那么意味着我写的每一个函数都会与IF一起嵌套,检查每个阶段是否存在错误。这是其他人做的吗?

我没有看到许多其他的脚本是这样写的,嵌套的IF做出了三角形形状,只在中间有所需的结果。如果中间没有达到,那么就搞砸了。

这是一个很好的功能结构吗?

+0

你可以简单地将它们全部添加到一个if语句中,或者保留它,因为它是为了让自己清楚,它的所有关于个人品味 – Hawili 2012-08-07 04:30:44

回答

29

嵌套过深通常是一个坏主意 - 它是意大利面条的逻辑和难以遵循。因为你的每一个验证步骤取决于前级已经成功了,不要窝在所有 - 刚刚摆脱困境,当一个阶段失败:

function change_password(blah blah blah) { 
    if (!$condition1) { 
     return false; 
    } 
    if (!$condition2) { 
     return false; 
    } 
    etc.... 


    // got here, must have succeeded 
    return true; 
} 

这使得它明确清晰的逻辑顺序是什么。

2

我认为这绝对是好读,可以很容易地在比较可以理解为只使用一个if声明像

if (blah and blah and blah and blah and blah and blah and blah) {} 

不过我还是更喜欢做这种方式 - 太多的缩进可以得到有点儿讨厌:

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if (!$email || !$password || !$new_password || !$confirm_new_password) return false; 
    if ($new_password != $confirm_new_password) return false; 
    if (!login($email, $password)) return false; 
    if (!set_password($email, $new_password)) return false; 

    return true; 
} 
1

它可以很好地嵌套它们,因为通过改变顺序可以避免进行额外的比较。你现在正在做的很好看,但是你的功能将是低效率的,如果你不是写为:

function change_password($email, $password, $new_password, $confirm_new_password) 
{ 
    if($new_password == $confirm_new_password && $email && $password && $new_password && $confirm_new_password) 
    { 
     if(login($email, $password)) 
     { 
      if(set_password($email, $new_password)) 
      { 
       return TRUE; 
      } 
     } 

    } 
} 

如果$ NEW_PASSWORD == $ confirm_new_password是真实的,但$电子邮件是空的,你会做了一个额外比较。

正如其他人所说,还有其他方法可以解决这个问题,而不会嵌套一切,这在功能上是等同的。