2009-11-01 98 views
5
switch ($foo) 
    { 
     case 3 || 5: 
      bar(); 
     break; 

     case 2: 
      apple(); 
     break; 
    } 

在上面的代碼中,第一個switch語句是否有效?我想它調用的函數bar()如果$foo的值是3或5是否可以使用||在PHP開關?

+1

我不知道了很多關於PHP,但我會假設(3 || 5)轉換爲TRUE。 – 2009-11-01 23:56:08

+2

'3 || 5'似乎在switch語句中被評估爲「true」,因此將總是爲'$ foo'的任何值調用'bar()'。 – 2009-11-01 23:56:43

+0

@Mark Rushakoff - 不,對開關值和大小寫值進行寬鬆比較,如果例如$ foo == 0,則3 || 5個案例代碼不會被執行。 (就像if(0 ==(3 || 5))會解析爲false) – GZipp 2009-11-02 00:58:27

回答

24

你應該趁秋天通過開關語句:

switch ($foo) 
    { 
     case 3: 
     case 5: 
      bar(); 
     break; 

     case 2: 
      apple(); 
     break; 
    } 

PHP man page有一些例子就是這樣的。

5

相反,使用的switch報表的主要優勢之一:

switch($foo) { 
    case 3: 
    case 5: 
     bar(); 
     break; 

    case 2: 
     apple(); 
     break; 
} 
6

我想你需要的是:

switch ($foo) 
{ 
    case 3: 
    case 5: 
     bar(); 
    break; 

    case 2: 
     apple(); 
    break; 
} 

有趣的是,我聽說Perl是(或者甚至到目前爲止)引入了這種語法,沿着以下幾點:

if ($a == 3 || 5) 

我不是big由於我不得不相當多地編寫詞法分析器,並且認爲語言應該儘可能的明確,但隨後,Perl已經解決了所有這些各種各樣的問題與那些可怕的尾側前if S和or這麼我懷疑還會有與它沒有任何麻煩:-)

0

沒有,如果你寫case 3 || 5:,那麼你不妨寫case True:,這當然不是你想要的。但是你可以把case語句直接相互下面:

 
switch ($foo) 
    { 
     case 3: 
     case 5: 
      bar(); 
     break; 

     case 2: 
      apple(); 
     break; 
    } 
1

是啊,我覺得你有什麼有相當於:

 
    <?php 

    $foo = 5000 ; 

    switch($foo) 
    { 
     case true : // Gzipp: an '=='-style comparison is made 
     echo 'first one' ; // between $foo and the value in the case 
     break;    // so for values of $foo that are "truthy" 
          // you get this one all the time. 

     case 2: 
     echo 'second one'; 
     break; 

     default: 
     echo 'neither' ; 
     break; 
    } 

    ?> 
+0

'case true:'行將不會總是被獲得。每種情況下的值與開關值的鬆散比較;如果它解析爲真,代碼將被執行。所以,如果$ foo是0,或者'',或者其他任何鬆散地解析爲false的東西,這個情況都會被繞過。 – GZipp 2009-11-02 00:37:55

+0

感謝Gzipp,已更新。 – bobobobo 2009-11-02 01:12:27