2012-01-19 21 views
6

Hay muchos "¿Por qué PHP arroja un error aquí?" preguntas Bueno, esto es un poco diferente. He encontrado el siguiente código, mientras que volver a trabajar algún código escrito por un compañero de trabajo:¿por qué PHP no está arrojando un error de análisis?

foreach($arr as $key => $value) {http://google.com/ 
    echo $value; 
    // ... 
} 

Lo primero que pensé: "Umm ... qué vergüenza, sino que debe haber pegado accidentalmente en que existe ...", seguido de: "Wait ... no hay forma de que este código realmente se ejecute ... eso debería ser un error de sintaxis ". Y, sin embargo:

$ php -l test.php 
No syntax errors detected 

Y, en efecto, (como mucho código PHP que aparentemente no debería de ejecución) que se ejecuta en la producción sin problemas. Así que hice una pequeña prueba:

foreach($arr as $key => $value) {http://google.com/ <-- original, no error 
foreach($arr as $key => $value) {http: <-- also no syntax error 
foreach($arr as $key => $value) {http <-- bingo! "Unexpected T_ECHO..." 

Qué golosina poco de la gramática de PHP está produciendo resultados tan extraños?

(estoy usando PHP 5.3.5)

Respuesta

7

El http: se interpreta como una etiqueta (que se utilizan para goto estados), y la //google.com/ como un comentario (que puede ser fácilmente visto a través de resaltado de sintaxis) .

Documentation on goto:

El operador puede usarse Goto para saltar a otra sección en el programa. El punto de destino se especifica mediante una etiqueta seguida de dos puntos, y la instrucción se da como goto seguido de la etiqueta de destino deseada.

+1

'http:' es una etiqueta, y '//' es un comentario. He visto este truco antes. – Borealid

+0

Por supuesto. No tenía idea de que PHP tenía 'goto'. Difícil. – chesles

+3

Ugh. Otro artículo sobre "¿por qué? * Infierno" ¿tuvo que implementarse esta triste característica en un lenguaje que ya está plagado de tontas funciones? " lista. –

Cuestiones relacionadas