2012-03-29 29 views
8

¿Por qué no funciona? Aparece Parse error: syntax error, unexpected ':' ... en la línea 7if {} en if: endif

$a = 0; $b = 1; $c = 3; $d = 4; 
if ($a == $b): 
    if ($b == $c) { 
     // something 
    } 
else: 
    $c = $a; 
endif; 

Pero si cambio a (se agregó else):

$a = 0; $b = 1; $c = 3; $d = 4; 
if ($a == $b): 
    if ($b == $c) { 
     // something 
    } else { 
     // something 
    } 
else: 
    $c = $a; 
endif; 

Trabaja muy bien.

¿Por qué es eso? ¿No es un error de PHP? O hay una regla sobre si ... ¿más debería saber?

De todos modos, estoy usando la versión PHP 5.3.3.

+0

Pegue los números de línea – JAM

+0

http://stackoverflow.com/questions/564130/difference-between-if-and-if-endif – Pheonix

+4

Interesante, y una buena ilustración de por qué probablemente no debería mezclar el flujo de estilo de plantillas control de declaraciones con los regulares reforzados. (o use el estilo de plantillas _at all_ a menos que esté codificando una vista HTML ... pero esa es la opinión) –

Respuesta

14

No estoy seguro de si me llamo esto es un error, pero creo que está teniendo este problema debido a un dangling else, en conjunto con su mezclado si-else sintaxis:

if ($a == $b):   // 1 
    if ($b == $c) {  // 2 
     // something  // 3 
    }      // 4 
else:      // 5 - this else 
    $c = $a;    // 6 
endif;     // 7 

Nota cómo el else en la línea 5 es ambiguo: podría "pertenecer" a la primera o segunda declaración if.

Se puede quitar fácilmente que la ambigüedad y corregir su error de sintaxis mediante la adición de un punto y coma después de su anidada if:

if ($a == $b):   // 1 
    if ($b == $c) {  // 2 
     // something  // 3 
    };     // 4 - here 
else:      // 5 
    $c = $a;    // 6 
endif;     // 7 

En otra nota, por favor, no utilice esta sintaxis menos que usted quiere que sus compañeros programadores para golpear te mueres en tu sueño.

+0

+1 para los lols de la nota – jprofitt

+0

Acerca de lo que iba a escribir. Solo mejor. :) – GolezTrol

+0

Gracias por su consejo. No mezclaré la sintaxis. es solo una pequeña maravilla lo que se convierte en cuestión. – user1301744

0

La forma de dos puntos del if/else puede ser ambigua al tratar con if anidados. En su ejemplo, el otro se adjunta el segundo si (como debería). Para evitar esto, debe indicar explícitamente al intérprete que ese otro está emparejado con el primero si, bien añadiendo un else al segundo if (como se muestra en el segundo bloque de código) o usando {} para definir explícitamente el flujo de control.

En otras palabras, puede usar varias formas de declaraciones if. Por ejemplo:

if (foo): 
    //statements 
else { 
    //statements 
} 

Es perfectamente válido. Aunque recomendaría no mezclar formas, ya que elimina la legibilidad.