PHP if else - правильное использование «else» - PullRequest
2 голосов
/ 29 января 2012

Профессор давно сказал мне, чтобы использовать else при «сцеплении» нескольких условий в серии (я все еще учился). Теперь, когда я возился с несколькими фреймворками и CMS несколько лет спустя, я нахожу довольно забавным, что то, чему меня учили, не обязательно так.

Меня учили использовать else между сериями условий:

function double(param){
    if(param==1){
        return param+=1;
    }
    else 
    if(param==2){
        return param+=2;
    }
    else{
        return false;
    }
}

В настоящее время я, кажется, вижу это, о чем меня давно предупреждали, НЕ делать:

function double(param){
    if(param==1){
        return param+=1;
    }
    if(param==2){
        return param+=2;
    }
    return false;
}

Этот пример кода может не работать, но идея есть: Нужно ли использовать else между каждым условием? Если так (или нет), на что мне обратить внимание, когда использовать в любом случае? Должно быть, что-то заставило моего профессора сказать мне такую ​​вещь.

Ответы [ 8 ]

4 голосов
/ 29 января 2012

Использование else или неиспользование означает две разные вещи.

Если вы хотите проверить ряд условий, в которых не более один может быть истинным, используйте else или else if. Когда одно условие оценивает true, выполняется код в блоке, а затем завершается вся конструкция if-else.

Когда более чем одно условие может быть истинным, использование else будет препятствовать оценке других условий в значении true, и поэтому было бы неправильно использовать else в этой ситуации.

Редактировать: теперь я вижу, что вы имеете в виду конкретный случай, когда каждое предложение содержит оператор возврата. В этом случае, вероятно, лучше использовать else или elseif, чтобы прояснить, что конструкция if-else ведет себя первым образом - т.е. может выполняться не более одного условия.

2 голосов
/ 29 января 2012

Это действительно просто вопрос мнения.

Нет необходимости использовать else в таком случае, как это, однако ваш профессор, возможно, описывал другой случай, или, возможно, он просто велел вам сделать это для подчеркнутой / вынужденной ясности.

Прежде всего, я считаю, что возвращать разные типы данных из одной и той же функции - это вообще плохой стиль, но, сказав это, возьмите пример:

function double($param) {
    if ($param == 1) {
        return $param + 1;
    } else if ($param == 2) {
        return $param + 1;
    } else {
        return false;
    }
}

Теперь представьте себе подобный пример, за исключением того, что он не возвращается каждый раз:

function double($param) {
    $returnMe = 0;

    if ($param == 1) {
        $returnMe = $param + 1
    } else if ($param == 2) {
        $returnMe = $param + 2;
    } else {
        $returnMe = false;
    }

    return $returnMe;
}

Это может показаться тривиальным (и в примерах, если это в основном так), вы можете видеть, что в действительности действительно имеет значение.

Заставляя все иметь другого, как он, он, вероятно, просто пытался обеспечить некоторую последовательность в стиле (что, я бы сказал, хорошо для новичков).

Конечно, вы правы, в случае, когда вы представили, в остальном не было необходимости. Плохо это или нет, на самом деле это просто вопрос мнения.

2 голосов
/ 29 января 2012

Нет необходимости использовать else, поскольку поток управления возвращается из функции сразу же в точке ключевого слова return.

Кроме того, я нахожу использование else, когда есть возврат, излишне запутывающим, и поэтому предпочел бы альтернативу 2 во всех случаях.

1 голос
/ 29 января 2012

Сценарий 1

if ($one) {
    doA();
}
if ($two) { // ALWAYS check this block - it is not attached to anything
    doB();
}

Truth table:

            | $one True | $one False 
------------+-----------+------------
$two True   | A and B   | B only   
$two False  | A only    | none

Сценарий 2

if ($one) {
    doA();
}
else if ($two) {  // ONLY check this block if $one is false!
    doB();
}

Truth table:

            | $one True | $one False 
------------+-----------+------------
$two True   | A only    | B only   
$two False  | A only    | none

Как видно из таблиц истинности, эти два сценария не совпадают. Таким образом, использование if..else или if..if - это не просто вопрос семантики или вкуса, это фактическая функциональная разница.

В случае возвращает внутри if, он полностью выйдет из функции и, следовательно, это особый случай, когда result равен такой же как else-if.

0 голосов
/ 29 января 2012

Вам может понравиться этот сценарий, который я заметил не так давно на сайте Apple

switch(true) {
    case foo == bar:
        break;
    case foo > 5:
        break;
    case foo > 10:
    case bar > 5:
        break;
}

Вы поняли идею.Я считаю, что все компиляторы разбивают это на код if / else, но мне нравится гибкость управления тем, где находятся операторы break.

0 голосов
/ 29 января 2012

это действительно зависит от потока ваших кодов ... иногда вам нужно использовать отдельные if (s), а иногда вам нужно использовать if (s) и else (s) ... но ради примера, который вы добавили. лично я бы выбрал первый, который вы написали, потому что он более эффективен, легче читать и понимать возможно, есть и другие факторы и моменты, но я так вижу, и поэтому выбрал первый ..

еще одна вещь, которую нужно добавить .. это то, что если вы используете второе, компилятор всегда будет выполнять второе «если», если $ param содержал другое значение, отличное от «1» или «2».

0 голосов
/ 29 января 2012

Да . Зачем? Потому что эти условия основаны на одной и той же переменной, и только одно может быть выполнено. По этой причине, если вы используете elseif (PHP) или else if (JavaScript), вы улучшите видимость кода и, возможно, избежите некоторых будущих ошибок.

Ваш код в PHP

Ваш код в PHP будет выглядеть так:

function double($param){
    if($param==1){
        return $param+=1;
    }
    elseif($param==2){
        return $param+=2;
    }
    else{
        return false;
    }
}

или, используя switch аналог:

function double($param){
    switch ($param) {
        case 1:
            return $param+=1;
        case 2:
            return $param+=2;
        default:
            return false;
    }
}

Ваш код в JavaScript

В JavaScript это будет выглядеть так:

function double($param){
    if($param==1){
        return $param+=1;
    }
    else if($param==2){
        return $param+=2;
    }
    else{
        return false;
    }
}
0 голосов
/ 29 января 2012

Я думаю, что это хорошая практика, потому что поток будет следовать, если вы забудете предложение return (приводящее к труднодоступным ошибкам) ​​

В любом случае, предложение else может быть слишком многословным вВ некоторых ситуациях вы можете использовать elseif:

<?php
if ($a > $b) {
    return "a is bigger than b";
} elseif ($a == $b) {
    return "a is equal to b";
} else {
    return "a is smaller than b";
}
?>
...