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

     case 2: 
      apple(); 
     break; 
    } 

En el código anterior, ¿es válida la primera declaración de cambio? Quiero que llame a la función bar() si el valor de $foo es de 3 ó 5¿Es posible usar || en el modificador de PHP?

+1

no sé mucho acerca de PHP, pero lo haría supongamos (3 || 5) traducir a VERDADERO. –

+2

'3 || 5' parece ser evaluado como 'verdadero' dentro de una sentencia switch y así siempre llamará a' bar() 'para cualquier valor de' $ foo'. –

+0

@Mark Rushakoff - No, se realiza una comparación suelta entre el valor del cambio y el valor del caso, y si, por ejemplo, $ foo == 0, entonces el 3 || El código de 5 casos no se ejecutará. (Al igual que si (0 == (3 || 5)) se resolvería en falso.) – GZipp

Respuesta

24

Usted debe tomar ventaja de la caída a través de los estados de conmutación:

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

     case 2: 
      apple(); 
     break; 
    } 

El PHP man page tiene algunos ejemplos como este.

5

su lugar, utilice una de las principales ventajas de switch declaraciones:

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

    case 2: 
     apple(); 
     break; 
} 
6

Creo que lo que necesita es:

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

    case 2: 
     apple(); 
    break; 
} 

Curiosamente, he oído que es Perl (o tal vez incluso tiene, por ahora) la introducción de esta sintaxis, algo así como:

if ($a == 3 || 5) 

No soy un grande admirador de esa sintaxis ya que he tenido que escribir analizadores léxicos bastante y creo que los idiomas deberían ser lo menos ambiguos posible. Pero entonces, Perl ha resuelto todos estos tipos de problemas antes con los espantosa del lado de la cola if s y s or por lo que sospecho que no habrá problemas con él :-)

0

No, si usted escribió case 3 || 5:, entonces también podría escribir case True:, que ciertamente no es lo que quería. Sin embargo puede usar comandos de casos directamente debajo de uno al otro:

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

     case 2: 
      apple(); 
     break; 
    } 
1

sí, creo que lo que tienes no es equivalente a:

 
    <?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

La línea 'case true' '_no_ siempre se obtendrá. El valor de cada caso se compara libremente con el valor del interruptor; si se resuelve como verdadero, se ejecuta el código. Por lo tanto, si $ foo es 0, o '', o cualquier otra cosa que se resuelva de manera vaga a falsa, se saltará el caso. – GZipp

+0

Gracias Gzipp, actualizado. – bobobobo

Cuestiones relacionadas