2010-08-02 3 views
4

Это должен быть простой вопрос. У меня есть простой, если/другое заявление:В чем разница между if и elseif?

<?php 
    // TOP PICTURE DEFINITIONS 
    if (is_page('english')) { 
     $toppic = 'page1.png'; 
    } 
    if (is_page('aboutus')) { 
     $toppic = 'page1.png'; 
    } 
    if (is_page('newspaper')) { 
     $toppic = 'page1.png'; 
    } 
    else { 
     $toppic = 'page1.png'; 
    } 
?> 

Есть ли разница от ^^^ к этому:

<?php 
    // TOP PICTURE DEFINITIONS 
    if (is_page('english')) { 
     $toppic = 'page1.png'; 
    } 
    elseif (is_page('aboutus')) { 
     $toppic = 'page1.png'; 
    } 
    elseif (is_page('newspaper')) { 
     $toppic = 'page1.png'; 
    } 
    else { 
     $toppic = 'page1.png'; 
    } 
?> 

Следует отметить, что это происходит в Wordpress. И до сих пор я использовал первую часть (no elseif, просто серию «ifs»), и она работает. Мне было просто интересно узнать, в чем разница.

Спасибо! Amit

+2

Dupe of http://stackoverflow.com/questions/637980/if-else-and-if-elseif или http://stackoverflow.com/questions/2881560/is-using-if-elseif-elseif-better -than-using-if-if-if или ...? – 2010-08-02 05:27:16

+0

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

+0

Спасибо, очень признателен. – Amit

ответ

16

Да. Если условие в элементе управления if/else выполнено, остальные проверки будут опущены. else if - это всего лишь вложенный if внутри else!

if (is_page('english')) { // if true, other statements are skipped 
    $toppic = 'page1.png'; 
} 
elseif (is_page('aboutus')) { 
    $toppic = 'page1.png'; 
} 
elseif (is_page('newspaper')) { 
    $toppic = 'page1.png'; 
} 
else { 
    $toppic = 'page1.png'; 
} 

Но в серии if с, все они будут проверены.

if (is_page('english')) { 
    $toppic = 'page1.png'; 
} 
if (is_page('aboutus')) { // will be tested no matter what the outcome 
          // of the previous if statement was 
    $toppic = 'page1.png'; 
} 
if (is_page('newspaper')) { // the same here 
    $toppic = 'page1.png'; 
} 
else { 
    $toppic = 'page1.png'; 
} 

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

if(number_is_odd) { 
} 
else { // if it's not odd, it's even for sure 
} 

чем

if(number_is_odd) { 
} 

if(!number_is_odd) { 
} 

Поскольку прежние проверки условие один раз в то время как последний делает это дважды. То же самое касается условий с более чем двумя состояниями.

+0

Получил это. Спасибо, что поняли! – Amit

+0

Я видел худшие примеры в руководствах по PHP. Отличная работа! – Drew

+0

Хотя это отличный ответ, для случая, изложенного в этом вопросе, он должен быть установлен как оператор 'switch', потому что каждый из них оценивает один и тот же предмет ... – Martin

2

Первый метод будет проверять каждое условие, независимо от того, являются ли они истинными или ложными.

Второй способ будет проверять каждое условие, пока оно не будет истинным, а затем проигнорирует остальное.

2

В вашем первом блоке выполняется каждое сравнение в вашем блоке. Кроме того, toppic всегда будет присваиваться значение is_page ('newspaper') или значение в is_page ('newspaper'). Это происходит потому, что последнее, если statment всегда оценивается. Даже если одно из предыдущих операторов if оценивается как true, вы попадете в блок else. Чтобы проверить это, попробуйте этот код ...

<?php 
    // TOP PICTURE DEFINITIONS 
    if (is_page('english')) { 
     $toppic = 'english.png'; 
    } 
    if (is_page('aboutus')) { 
     $toppic = 'aboutus.png'; 
    } 
    if (is_page('newspaper')) { 
     $toppic = 'newspaper.png'; 
    } 
    else { 
     $toppic = 'finalelse.png'; 
    } 
?> 

Вы всегда заканчиваются либо «newspaper.png» или «finalelse.png».

1

Самое большое различие между ними состоит в том, что самый последний блок else будет вызываться всякий раз, когда is_page('newspaper') возвращает false. В этом случае это означает почти каждый раз, когда запускается скрипт. В этом случае это не имеет большого значения, поскольку вы устанавливаете только переменную, и это то же значение, что и все остальное. Но, если бы все было иначе, у вас была бы очень неприятная ошибка для отслеживания!

Кроме того, если вы используете отдельные операторы if, условие для каждого if оценивается каждый раз. Опять же, в этом случае, это (вероятно) не большая проблема. Но, если бы это было условие, скажем ...

if(delete_file('foo.png')) { 
    .... 
} 

if(delete_file('bar.png')) { 
    .... 
} 

if(delete_file('baz.png')) { 
    .... 
} 
else { 
    .... 
} 

Ну, вы должны быть в состоянии увидеть, где это происходит;) Если вы используете elseif, он перестанет пытаться оценить, как только это становится правдой. И другое будет вызвано, если ничего не будет истинным.

2
<?php 
    if (3 > 1) { 
     echo "This will be printed."; 
    } 
    if (3 > 2) { 
     echo "This will be printed too."; 
    } 
    if (3 > 3) { 
     echo "This will NOT be printed."; 
    } 
    else { 
     echo "This WILL be printed."; 
    } 
?> 

но с ELSEIF:

<?php 
    if (3 > 1) { 
     echo "This will be printed."; 
    } 
    elseif (3 > 2) { /* This condition will not be evaluated */ 
     echo "This will NOT be printed"; 
       // because it's on the ELSE part of the previous IF 
    } 
    elseif (3 > 3) { /* This condition will not be evaluated either */ 
     echo "This will NOT be printed."; 
    } 
    else { /* This ELSE condition is still part of the first IF clause */ 
     echo "This will NOT be printed."; 
    } 
?> 

Таким образом, вы должны использовать ELSEIF, потому что в противном случае $ toppic всегда будет результат на любом 'newspaper.png', которым должно быть право, или 'finalelse.png' который может быть правильным или неправильным, потому что он перезапишет предыдущие условные предложения.

Надеюсь, вы найдете это полезным.

1

Ответ прост:

if(a==1){ 
    b 
} 
elsif(b==1){ 
    c 
} 

равна

if(a==1){ 
    b 
} 
else{ 
    if(b==1){ 
    c 
    } 
} 

Это то же самое, как

if(a==1){ 
    b 
} 
if(b==1){ 
    c 
} 

, если это не возможно, что == 1 и Ь = = 1 в то же время. Хотя когда оба оператора if могут быть истинными, когда b и c могут быть выполнены. Это было бы невозможно, если вы используете elsif там, потому что b == 1 будет проверяться только, если a! = 1!

0

Использование elseif мудро поможет вам сэкономить кучу времени, так как парсер не должен оценивать все условия.

2

Это не всегда вопрос эффективности. Если вы переключая что-то, что необходимо использовать else if и не только if

Допустим, мы переключая переменную $computerOn

if ($computerOn == true) { 
    $computerOn = false; 
} 
if ($computerOn == false) { 
    $computerOn = true; 
} 

В случае выше ваш $computerOn будет всегда быть true. Если оно true, оно установлено на false. После этого мы проверяем, является ли оно false, которое теперь должно быть не зависящим от начальных условий, поэтому оно теперь установлено на true.

С другой стороны, ниже код будет переключать $ computerOn:

if ($computerOn == true) { 
    $computerOn = false; 
} elseif ($computerOn == false) { 
    $computerOn = true; 
} 

Теперь мы только проверить ли $computerOn является false, если он не был изначально true. Следовательно, у нас есть переключатель.

Если все усложняется, возможно, вам придется использовать несколько elseif s. Важно признать, что логика диктует, что elseif является обязательным по сравнению с опцией.

+1

Люблю пример. спасибо – Amit