PHP - 嵌套的IF语句

时间:2012-08-07 04:28:13

标签: php nested-if

我想知道使用多个嵌套的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(!change_password($email, $password, $new_password, $confirm_new_password)
{
    echo 'The form was not filled in correctly!';
    exit;
}

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

我没有看到很多其他类似的脚本,嵌套的IF形成三角形,只在中间有所需的结果。如果没有达到中间位置,那么就会搞砸了。

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

3 个答案:

答案 0 :(得分:31)

嵌套太深通常是一个坏主意 - 这是意大利面条的逻辑,很难遵循。由于您的每个验证步骤都取决于前一阶段的成功,因此根本不要嵌套 - 只需在阶段失败时挽救:

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


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

这使得它明确地清楚了逻辑顺序是什么。

答案 1 :(得分: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;
}

答案 2 :(得分: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为true,但$ email为空,则您将进行额外的比较。

正如其他人所说,还有其他方法可以解决这个问题而不需要嵌套所有东西,这在功能上是相同的。