Можно ли использовать || в переключателе PHP? - PullRequest
5 голосов
/ 02 ноября 2009
switch ($foo)
    {
        case 3 || 5:
           bar();
        break;

        case 2:
          apple();
        break;
    }

В приведенном выше коде действителен ли первый оператор switch? Я хочу, чтобы он вызывал функцию bar(), если значение $foo равно 3 или 5

Ответы [ 5 ]

24 голосов
/ 02 ноября 2009

Вы должны воспользоваться провалом операторов switch:

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

        case 2:
          apple();
        break;
    }

Справочная страница PHP содержит несколько примеров, подобных этому.

6 голосов
/ 02 ноября 2009

Я думаю, что вам нужно:

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

    case 2:
      apple();
    break;
}

Интересно, я слышал, что Perl (или, может быть, даже) уже вводит этот синтаксис, что-то вроде:

if ($a == 3 || 5)

Я не большой фанат этого синтаксиса, так как мне приходилось писать лексические парсеры совсем немного, и я считаю, что языки должны быть как можно более однозначными. Но затем Perl уже решил все эти виды проблем с этими отвратительными хвостовыми if s и or s, поэтому я подозреваю, что с этим не будет никаких проблем: -)

5 голосов
/ 02 ноября 2009

Вместо этого используйте одно из основных преимуществ операторов switch:

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

    case 2:
        apple();
        break;
}
1 голос
/ 02 ноября 2009

Да, я думаю, что то, что у вас есть, эквивалентно:

    <?php

    $foo = 5000 ;

    switch( $foo )
    {
      <b>case true :</b>   // 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 голосов
/ 02 ноября 2009

Нет, если вы написали case 3 || 5:, то вы могли бы просто написать case True:, что, конечно, не то, что вы хотели. Тем не менее, вы можете поместить case-заявления непосредственно друг под другом:

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

        case 2:
          apple();
        break;
    }
...