2010-08-02 109 views
4

这应该是一个简单的问题。我有一个简单的if/else语句: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。直到现在,我已经使用了第一部分(没有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 - 使用如果,如果如果或...? – 2010-08-02 05:27:16

+0

在你的情况下,它不关心你使用哪一个,但如果你有一些函数检查一些事情,它可以用elseif更快,它只检查,直到某些条件符合条件 – domiSchenk 2010-08-02 07:34:55

+0

谢谢,非常感谢。 – Amit 2010-08-02 08:31:43

回答

16

是的。如果满足if/else控件中的条件,则其余的检查将被省略。 else if只是else内嵌套的if

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 S,所有的人都将受到考验。

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) { 
} 

if(!number_is_odd) { 
} 

更好

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

因为前检查条件,一旦而后者则两次。具有两种以上状态的情况也是如此。

+0

明白了。感谢您使它更清晰! – Amit 2010-08-02 05:39:33

+0

我在PHP指南中看到过更糟糕的例子。做得好! – Drew 2010-08-02 07:08:54

+0

虽然这是一个很好的答案,对于这个问题中概述的情况,它应该被设置为一个“switch”语句,因为每个if都在评估相同的主题项目... – Martin 2016-07-01 14:39:54

2

第一种方法将检查每个条件,无论它们是真的还是假的。

第二种方法将检查每个条件,直到一个为真,然后忽略其余。

2

在您的第一个块中,块中的每个比较都会执行。此外,toppic将始终分配is_page('newspaper')中的值或is_page('newspaper')的else语句中的值。发生这种情况是因为最后一个陈述总是被评估。即使前面的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

两者最大的区别在于,只要is_page('newspaper')返回false,就会调用最后一个else块。在这种情况下,这意味着几乎每次脚本运行。在这种情况下,这不是什么大问题,因为你只设置了一个变量,并且与其他所有变量的值相同。但是,如果它不同,你会有一个非常令人沮丧的错误追踪!

除此之外,如果您使用单独的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并且b = = 1。虽然两个if语句都可以为true,但是当可以执行b和c时。这是不可能的,如果你在那里使用elsif,因为b == 1只会在!= 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; 
} 

现在我们只检查是否$computerOnfalse如果不是最初true。因此我们有一个切换。

如果事情变得更加复杂,您可能必须使用多个elseif s。当逻辑决定elseif是必须的还是选择的时候,认识到这一点很重要。

+1

喜欢这个例子。谢谢 – Amit 2010-08-05 07:09:56