为什么最好先在if语句中检查“ false”?

时间:2018-11-02 08:26:16

标签: php performance if-statement conditional-statements

例如,以下代码首先测试false,然后测试true。这样做有什么性能上的好处或节省时间吗?

if (!touch('some_file.txt', $time)) {
    echo 'Whoops, something went wrong...';
} else {
    echo 'Touched file with success';
}

代替

if (touch('some_file.txt', $time)) {
    echo 'Touched file with success';
} else {
    echo 'Whoops, something went wrong...';
}

3 个答案:

答案 0 :(得分:0)

您可以先检查真相,但在大多数情况下,如果为false(例如文件不存在,则可以与代码进行交互),因此可以将return false放在if块中。

如果使用if (touch()),则必须在{}块中编写许多代码

比较:

if (touch(file)) {
    //do something...
    // do domething else...
    if (file contensts) {
        //do something....
        //and so on...
        if() {
           // you can continue yourself...
        }
    }
    // continue...
}

if (!touch(file)) {
    throw new Error('some error');
    // or return false
}

//do something...
// do domething else...

if (!contents(file)) {
    return false;
}

// continue...

因此,要坚持一种风格,每个人都要先检查false

答案 1 :(得分:0)

在第一个条件下出现错误并没有实际的性能优势。但是,我个人这样做是为了获得更简洁的代码。通常,如果为false,则应终止该功能。

if (!$true)
   return false;

long code...

不是很长的括号,有时很难跟踪。

答案 2 :(得分:0)

实际上,检查“ false”不是问题的表现,而是循环复杂性的问题。让我说清楚: 想象一下,您必须先满足4或5个条件,然后才能采取行动:

if (condition1 === true) {
    ...code

    if (condition2 === true) {
        ...code

        if (condition3 === true) {
            ...code

            if (condition4 === true) {
                ...code

                if (condition5 === true) {
                    ...code
                    return value;
                }
            }
        }
    }
}

理解起来会很复杂吗? 现在,通过检查“ false”来应用“ leave early”规则。 下面的代码与上面的代码完全相同:

if (condition1 === false) {
    return;
}

...code of condition 1 when is true
if (condition2 === false) {
    return;
}


...code of condition 2 when is true
if (condition3 === false) {
    return;
}


...code of condition 3 when is true
if (condition4 === false) {
    return;
}

...code of condition 4 when is true
if (condition5 === false) {
    return;
}

return value;

看看代码如何更简洁易读?这仅仅是因为您将嵌套级别保持在最低水平,而不是累积它们。

我希望这能回答您的问题。