2012-01-19 52 views
6

Có rất nhiều "Tại sao PHP đưa ra lỗi ở đây?" câu hỏi. Vâng, đây là một chút khác nhau. Tôi thấy đoạn mã sau khi làm lại một số mã được viết bởi một đồng nghiệp:tại sao PHP không ném lỗi phân tích cú pháp?

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

Suy nghĩ đầu tiên của tôi: "Umm ... làm thế nào lúng túng, ông hẳn đã vô tình dán mà ở đó ...", tiếp theo: "Chờ ... không có cách nào mã này thực sự chạy ... mà nên là một lỗi cú pháp ". Chưa hết:

$ php -l test.php 
No syntax errors detected 

Và quả thực, (như rất nhiều mã PHP mà dường như không nên chạy) nó chạy trong sản xuất mà không gặp rắc rối. Vì vậy, tôi đã làm một thử nghiệm nhỏ:

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

Điều gì nhỏ nhặt của ngữ pháp của PHP là tạo ra kết quả lạ như vậy?

(Tôi đang sử dụng PHP 5.3.5)

Trả lời

7

Các http: đang được hiểu như là một nhãn (được sử dụng cho goto báo cáo), và //google.com/ như một bình luận (mà có thể dễ dàng được nhìn thấy qua làm nổi bật cú pháp) .

Documentation on goto:

Nhà điều hành goto có thể được sử dụng để nhảy đến phần khác trong chương trình. Điểm mục tiêu được chỉ định bởi một nhãn theo sau là dấu hai chấm và lệnh được đưa ra dưới dạng goto theo sau là nhãn mục tiêu mong muốn.

+1

'http:' là nhãn và '//' là nhận xét. Tôi đã nhìn thấy thủ thuật này trước đây. – Borealid

+0

Tất nhiên. Tôi không biết PHP có 'goto'. Khôn lanh. – chesles

+3

Ugh. Một mục khác trên "lý do tại sao * địa ngục * đã làm tính năng ảm đạm này phải được thực hiện trong một ngôn ngữ đã được cưỡi với các tính năng câm?" danh sách. –

Các vấn đề liên quan