2012-01-19 12 views
6

Ci sono molti "Perché PHP lancia un errore qui?" domande. Bene, questo è un po 'diverso. Ho trovato il seguente codice, mentre la rielaborazione del codice scritto da un collega:perché PHP non genera un errore di analisi?

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

Il mio primo pensiero: "Umm ... come imbarazzante, deve aver accidentalmente incollato che là dentro ..." seguito da: "Aspetta ... non è possibile che questo codice venga effettivamente eseguito ... dovrebbe essere un errore di sintassi ". E tuttavia:

$ php -l test.php 
No syntax errors detected 

E infatti, (come tanto di codice PHP che apparentemente non dovrebbero funzionare) viene eseguito in produzione senza difficoltà. Così ho fatto un po 'di test:

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..." 

Quale piccolo bocconcino della grammatica di PHP sta producendo risultati così strani?

(sto usando PHP 5.3.5)

risposta

7

Il http: viene interpretato come etichetta (che sono utilizzati per goto dichiarazioni), e il //google.com/ come commento (che può essere facilmente visibile attraverso evidenziazione della sintassi) .

Documentation on goto:

L'operatore goto può essere utilizzato per passare a un'altra sezione del programma. Il punto di destinazione è specificato da un'etichetta seguita da due punti e l'istruzione viene fornita come goto seguita dall'etichetta di destinazione desiderata.

+1

'http:' è un'etichetta e '//' è un commento. Ho visto questo trucco prima. – Borealid

+0

Naturalmente. Non avevo idea che PHP avesse 'goto'. Difficile. – chesles

+3

Ugh. Un altro elemento sul "perché * l'inferno * ha fatto questa triste funzionalità deve essere implementato in una lingua che è già guidata da caratteristiche stupide?" elenco. –

Problemi correlati