2012-03-29 33 views
8

Tại sao nó không hoạt động? Xuất hiện Parse error: syntax error, bất ngờ ':' ... trên dòng 7nếu {} in if: endif

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

Nhưng nếu tôi thay đổi nó để (chỉ cần thêm else statement):

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

Nó hoạt động tốt.

Tại sao lại như vậy? nó không phải là một lỗi PHP? Hoặc có một quy tắc về nếu ... khác tôi nên biết?

Dù sao, tôi đang sử dụng phiên bản 5.3.3 PHP.

+0

Vui lòng dán số dòng – JAM

+0

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

+4

Thú vị - và minh họa tốt về lý do tại sao bạn có thể không nên trộn luồng kiểu mẫu các câu lệnh điều khiển với các câu lệnh kiểm soát đều đặn. (hoặc sử dụng phong cách templating _at all_ trừ khi bạn đang mã hóa một cái nhìn HTML ... nhưng đó là ý kiến) –

Trả lời

14

Tôi không chắc chắn nếu tôi sẽ gọi đây là một lỗi, nhưng tôi tin rằng bạn đang gặp vấn đề này vì một dangling else, kết hợp với hỗn hợp if-else Cú pháp của bạn:

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

Lưu ý cách các else trên dòng 5 là mơ hồ: nó có thể "thuộc về" hoặc đầu tiên hoặc thứ hai if báo cáo.

Bạn có thể dễ dàng loại bỏ sự mơ hồ đó và khắc phục lỗi cú pháp của bạn bằng cách thêm một dấu chấm phẩy sau khi bạn lồng nhau if:

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

Ngày lưu ý khác, vui lòng không sử dụng cú pháp này trừ khi bạn muốn lập trình viên đồng bào của bạn phải buộc bạn đến chết trong giấc ngủ của bạn.

+0

+1 cho lols từ ghi chú – jprofitt

+0

Về những gì tôi sắp viết. Chỉ có tốt hơn. :) – GolezTrol

+0

Cảm ơn lời khuyên của bạn. Tôi sẽ không trộn cú pháp. nó chỉ là một thắc mắc nhỏ mà biến thành câu hỏi. – user1301744

1

Như đã đề cập trong các nhận xét trên PHP manual's control structure page trình phân tích cú pháp dường như không phải lúc nào cũng giả định rằng if từ một kiểu không được khớp với một else bằng cách sử dụng loại kia.

0

Hình thức kết tràng của if/else có thể không rõ ràng khi xử lý các if lồng nhau. Trong ví dụ của bạn, người khác đang được gắn thứ hai nếu (như nó cần.) Để tránh điều này, bạn phải thông báo cho người thông dịch biết rằng người khác được ghép nối với người đầu tiên nếu, hoặc bằng cách thêm người khác vào thứ hai nếu (khi bạn hiển thị trong khối mã thứ hai của mình) hoặc sử dụng {} để xác định rõ ràng luồng điều khiển.

Nói cách khác, bạn có thể sử dụng nhiều dạng câu lệnh if. Ví dụ:

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

Hoàn toàn hợp lệ. Mặc dù tôi sẽ khuyên bạn nên chống lại các hình thức trộn vì nó mất đi từ khả năng đọc.

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