2012-01-19 5 views
6

Есть много «Почему PHP выдает ошибку здесь?» вопросов. Ну, это немного по-другому. Я нашел следующий код в то время как переделывая код, написанный сотрудником:Почему PHP не бросает ошибку синтаксического анализа?

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

Моя первая мысль: «Ммм ... как стыдно, он должен быть случайно вставили, что там ...», а затем: «Жди ... нет никакого способа, которым этот код действительно работает ..., который должен быть синтаксической ошибкой ». И еще:

$ php -l test.php 
No syntax errors detected 

И действительно, (вроде так много PHP коды, который, казалось бы, не должен работать) он работает в производстве без проблем. Поэтому я провел небольшое тестирование:

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

Какой маленький лакомый кусочек грамматики PHP производит такие странные результаты?

(Я использую PHP 5.3.5)

ответ

7

http: интерпретируется как метка (которые используются для goto заявлений), а //google.com/ как комментарий (который можно легко увидеть с помощью подсветки синтаксиса) ,

Documentation on goto:

Оператор Goto может быть использован, чтобы перейти в другой раздел программы. Целевая точка указана меткой, сопровождаемой двоеточием, и инструкция указывается как goto, за которой следует желаемая целевая метка.

+1

'http:' это метка, а '//' - комментарий. Я уже видел этот трюк. – Borealid

+0

Конечно. Я понятия не имел, что PHP имеет «goto». Tricky. – chesles

+3

Ugh. Еще один вопрос о том, почему «ад *» сделал эту мрачную функцию, должен быть реализован на языке, который уже обходит тупыми функциями? » список. –

Смежные вопросы