Lỗi phân tích cú pháp / cú pháp PHP; và làm thế nào để giải quyết chúng


651

Mọi người đều chạy vào lỗi cú pháp. Ngay cả các lập trình viên có kinh nghiệm làm lỗi chính tả. Đối với người mới, nó chỉ là một phần của quá trình học tập. Tuy nhiên, thường dễ dàng diễn giải các thông báo lỗi như:

Lỗi phân tích cú pháp PHP: lỗi cú pháp, không mong muốn '{' trong tệp index.php trên dòng 20

Biểu tượng bất ngờ không phải lúc nào cũng là thủ phạm thực sự. Nhưng số dòng cho một ý tưởng sơ bộ về nơi bắt đầu tìm kiếm.

Luôn luôn nhìn vào bối cảnh mã . Lỗi cú pháp thường ẩn trong các dòng mã được đề cập hoặc trong các dòng mã trước đó . So sánh mã của bạn với các ví dụ cú pháp từ hướng dẫn.

Trong khi không phải mọi trường hợp phù hợp với người khác. Tuy nhiên, có một số bước chung để giải quyết lỗi cú pháp . Tài liệu tham khảo này tóm tắt những cạm bẫy phổ biến:

Tài liệu tham khảo liên quan chặt chẽ:

Và:

Mặc dù Stack Overflow cũng đang chào đón các lập trình viên tân binh, nhưng nó chủ yếu được nhắm vào các câu hỏi lập trình chuyên nghiệp.

  • Trả lời lỗi mã hóa của mọi người và lỗi chính tả hẹp được coi là chủ đề ngoài chủ đề.
  • Vì vậy, vui lòng dành thời gian để làm theo các bước cơ bản , trước khi đăng yêu cầu sửa lỗi cú pháp.
  • Nếu bạn vẫn phải làm, hãy thể hiện sáng kiến ​​giải quyết của riêng bạn, cố gắng sửa lỗi và quá trình suy nghĩ của bạn về những gì có vẻ hoặc có thể sai.

Nếu trình duyệt của bạn hiển thị các thông báo lỗi, chẳng hạn như "Cú pháp: ký tự không hợp lệ", thì thực tế đó không phải làliên quan, nhưng một - lỗi cú pháp .


Lỗi cú pháp được nêu trên mã nhà cung cấp: Cuối cùng, hãy xem xét rằng nếu lỗi cú pháp không được nêu ra bằng cách chỉnh sửa cơ sở mã của bạn, nhưng sau khi cài đặt hoặc nâng cấp gói nhà cung cấp bên ngoài, có thể do không tương thích phiên bản PHP, vì vậy hãy kiểm tra các yêu cầu của nhà cung cấp đối với nền tảng của bạn thiết lập.


1
Đây không phải là đủ dữ liệu để trở thành một câu trả lời, nhưng người ta có thể viết một bộ phân tích với parsekit_compile_opes và đặt các câu trả lời thân thiện hơn cho nó. Nếu được tích hợp vào IDE của bạn, điều này có thể khá nhiều thông tin.
Owen Beresford

4
Bạn đặt một khối lượng công việc ấn tượng vào đây. Tôn trọng điều đó. Có lẽ rất tốt cho giáo viên học cách chỉ ra lỗi nhanh hoặc cho những người tạo IDE hoặc thực hiện sửa lỗi nhanh. Tuy nhiên, IDE sẽ thực hiện hiệu quả hầu hết công việc này cho bạn, như @Panique gợi ý. Ngoài ra, nhiều trường hợp bắt đầu lại từ đầu là một lựa chọn tốt.
allprog

1
@ Fred-ii- Tôi nghĩ rằng hầu hết các nguyên nhân tương tự như T_IF / T_FOREACH / ...khối. Mặc dù tôi muốn biên dịch một bản tóm tắt tùy chỉnh hơn cho các câu hỏi IF / ELSE / ELSEIF.
mario

1
@mario Bạn không biết cách diễn đạt điều này, nhưng câu hỏi và trả lời này có thể được viết lại một chút và có cấu trúc hơn không? (bình luận tạm thời)
Rizier123

2
Bạn biết đấy, tôi ước tôi đã có danh sách này khi tôi học PHP từ nhiều năm trước. Rất hữu ích, đặc biệt là cho người mới bắt đầu.
Chipster

Câu trả lời:


291

Các lỗi cú pháp là gì?

PHP thuộc ngôn ngữ lập trình Cbắt buộc . Nó có các quy tắc ngữ pháp cứng nhắc, mà nó không thể phục hồi khi gặp phải các ký hiệu hoặc mã định danh bị đặt sai vị trí. Nó không thể đoán được ý định mã hóa của bạn.

Tóm tắt định nghĩa hàm cú pháp

Lời khuyên quan trọng nhất

Có một vài biện pháp phòng ngừa cơ bản bạn luôn có thể thực hiện:

  • Sử dụng thụt mã thích hợp hoặc áp dụng bất kỳ kiểu mã hóa cao. Khả năng đọc ngăn ngừa sự bất thường.

  • Sử dụng IDE hoặc trình soạn thảo cho PHP với đánh dấu cú pháp . Điều này cũng giúp với dấu ngoặc đơn / cân bằng khung.

    Dự kiến: dấu chấm phẩy

  • Đọc tài liệu tham khảo ngôn ngữ và các ví dụ trong hướng dẫn. Hai lần, để trở nên thành thạo một chút.

Cách diễn giải lỗi trình phân tích cú pháp

Một thông báo lỗi cú pháp điển hình đọc:

Lỗi phân tích cú pháp: lỗi cú pháp, T_STRING không mong muốn , mong đợi ' ;' trong tệp.php trên dòng 217

Trong đó liệt kê các vị trí có thể của một lỗi cú pháp. Xem tên tập tin được đề cập và số dòng .

Một biệt danh như T_STRINGgiải thích biểu tượng nào mà trình phân tích cú pháp / mã thông báo cuối cùng không thể xử lý. Tuy nhiên, điều này không nhất thiết là nguyên nhân của lỗi cú pháp.

Điều quan trọng là phải xem xét các dòng mã trước đó . Thông thường lỗi cú pháp chỉ là rủi ro xảy ra trước đó. Số dòng lỗi chỉ là nơi trình phân tích cú pháp từ bỏ để xử lý tất cả.

Giải quyết lỗi cú pháp

Có nhiều cách tiếp cận để thu hẹp và sửa lỗi trục trặc.

  • Mở tệp nguồn được đề cập. Nhìn vào dòng mã được đề cập .

    • Đối với các chuỗi chạy trốn và các toán tử đặt sai vị trí, đây thường là nơi bạn tìm ra thủ phạm.

    • Đọc dòng từ trái sang phải và tưởng tượng mỗi biểu tượng làm gì.

  • Thường xuyên hơn, bạn cần phải nhìn vào các dòng trước là tốt.

    • Cụ thể, ;dấu chấm phẩy bị thiếu ở phần kết thúc / câu lệnh trước đó. (Ít nhất là từ quan điểm phong cách.)

    • Nếu {các khối mã }được đóng hoặc lồng không chính xác, bạn có thể cần điều tra thêm về mã nguồn. Sử dụng thụt mã thích hợp để đơn giản hóa điều đó.

  • Nhìn vào màu sắc cú pháp !

    • Chuỗi và biến và hằng nên có màu khác nhau.

    • Các nhà khai thác +-*/.nên được phân biệt là tốt. Khác họ có thể trong bối cảnh sai.

    • Nếu bạn thấy màu sắc chuỗi kéo dài quá xa hoặc quá ngắn, thì bạn đã tìm thấy một dấu đóng "hoặc thiếu 'chuỗi không đánh dấu hoặc thiếu .

    • Có hai ký tự dấu chấm màu giống nhau cạnh nhau cũng có thể có nghĩa là rắc rối. Thông thường, các nhà khai thác là duy nhất nếu nó không ++, --hay ngoặc sau một nhà điều hành. Hai chuỗi / định danh trực tiếp theo nhau là không chính xác trong hầu hết các bối cảnh.

  • Khoảng trắng là bạn của bạn . Thực hiện theo bất kỳ phong cách mã hóa.

  • Chia tay dài dòng tạm thời.

    • Bạn có thể tự do thêm dòng mới giữa các toán tử hoặc hằng và chuỗi. Trình phân tích cú pháp sau đó sẽ cụ thể hóa số dòng để phân tích lỗi. Thay vì nhìn vào mã rất dài, bạn có thể cô lập biểu tượng cú pháp bị thiếu hoặc thất lạc.

    • Tách các ifcâu lệnh phức tạp thành các ifđiều kiện riêng biệt hoặc lồng nhau .

    • Thay vì các công thức toán học dài hoặc chuỗi logic, hãy sử dụng các biến tạm thời để đơn giản hóa mã. (Dễ đọc hơn = ít lỗi hơn.)

    • Thêm dòng mới giữa:

      1. Mã bạn có thể dễ dàng xác định là chính xác,
      2. Những phần bạn không chắc chắn về,
      3. Và các dòng mà trình phân tích cú pháp phàn nàn về.

      Phân vùng các khối mã dài thực sự giúp xác định nguồn gốc của lỗi cú pháp.

  • Nhận xét mã vi phạm.

    • Nếu bạn không thể cô lập nguồn sự cố, hãy bắt đầu nhận xét (và do đó tạm thời xóa) các khối mã.

    • Ngay sau khi bạn thoát khỏi lỗi phân tích cú pháp, bạn đã tìm thấy nguồn vấn đề. Nhìn kỹ hơn ở đó.

    • Đôi khi bạn muốn tạm thời loại bỏ hoàn toàn các khối chức năng / phương thức. (Trong trường hợp dấu ngoặc nhọn chưa từng có và mã bị thụt sai.)

    • Khi bạn không thể giải quyết vấn đề cú pháp, hãy thử viết lại các phần đã nhận xét từ đầu .

  • Là người mới, tránh một số cấu trúc cú pháp khó hiểu.

    • ? :Toán tử điều kiện ternary có thể nén mã và thực sự hữu ích. Nhưng nó không hỗ trợ khả năng đọc trong mọi trường hợp. Thích ifbáo cáo đơn giản trong khi đảo ngược.

    • Cú pháp thay thế ( if:/ elseif:/ endif;) của PHP là phổ biến cho các mẫu, nhưng có thể dễ theo dõi hơn các khối {mã thông thường }.

  • Những sai lầm phổ biến nhất của người mới đến là:

    • Thiếu dấu chấm phẩy ;để chấm dứt câu lệnh / dòng.

    • Báo giá chuỗi không khớp cho "hoặc 'và trích dẫn không được trích dẫn trong.

    • Toán tử bị lãng quên, đặc biệt là .nối chuỗi .

    • Dấu (ngoặc không cân bằng ). Đếm chúng trong dòng báo cáo. Có một số lượng bằng nhau của họ?

  • Đừng quên rằng việc giải quyết một vấn đề cú pháp có thể phát hiện ra vấn đề tiếp theo.

    • Nếu bạn làm cho một vấn đề biến mất, nhưng các loại cây trồng khác trong một số mã dưới đây, thì bạn chủ yếu đi đúng hướng.

    • Nếu sau khi chỉnh sửa một lỗi cú pháp mới xuất hiện trong cùng một dòng, thì thay đổi đã cố gắng của bạn có thể là một thất bại. (Không phải lúc nào cũng vậy.)

  • Khôi phục bản sao lưu mã làm việc trước đó, nếu bạn không thể sửa nó.

    • Thông qua một hệ thống phiên bản mã nguồn. Bạn luôn có thể xem một diffphiên bản làm việc bị hỏng và cuối cùng. Điều này có thể làm sáng tỏ vấn đề cú pháp là gì.
  • Các ký tự Unicode vô hình đi lạc : Trong một số trường hợp, bạn cần sử dụng một hexeditor hoặc trình soạn thảo / trình xem khác nhau trên nguồn của mình. Một số vấn đề không thể được tìm thấy chỉ khi nhìn vào mã của bạn.

    • Hãy thử grep --color -P -n "\[\x80-\xFF\]" file.phplàm biện pháp đầu tiên để tìm các ký hiệu không phải ASCII.

    • Trong các BOM cụ thể, không gian có độ rộng bằng không hoặc không gian không phá vỡ và các trích dẫn thông minh thường xuyên có thể tìm đường vào mã nguồn.

  • Hãy quan tâm đến loại ngắt dòng nào được lưu trong tệp.

    • PHP chỉ tôn vinh các \ndòng mới, không \rtrả lại vận chuyển.

    • Điều này đôi khi là một vấn đề đối với người dùng MacOS (ngay cả trên OS X đối với các biên tập viên bị định cấu hình sai).

    • Nó thường chỉ xuất hiện dưới dạng một vấn đề khi sử dụng một dòng //hoặc #nhận xét. Multiline /*...*/comments làm ít khi làm phiền các phân tích cú pháp khi xuống hàng được bỏ qua.

  • Nếu lỗi cú pháp của bạn không truyền qua web : Điều đó xảy ra là bạn có lỗi cú pháp trên máy của mình. Nhưng đăng cùng một tập tin trực tuyến không thể hiện nó nữa. Điều đó chỉ có nghĩa là một trong hai điều:

    • Bạn đang xem sai tập tin!

    • Hoặc mã của bạn chứa Unicode đi lạc vô hình (xem bên trên). Bạn có thể dễ dàng tìm ra: Chỉ cần sao chép mã của bạn từ mẫu web vào trình soạn thảo văn bản của bạn.

  • Kiểm tra phiên bản PHP của bạn . Không phải tất cả các cấu trúc cú pháp đều có sẵn trên mọi máy chủ.

    • php -v cho trình thông dịch dòng lệnh

    • <?php phpinfo(); cho một người được gọi thông qua máy chủ web.


    Những cái đó không nhất thiết phải giống nhau. Đặc biệt khi làm việc với các khung công tác, bạn sẽ kết hợp chúng với nhau.

  • Đừng sử dụng các từ khóa dành riêng của PHP làm định danh cho các hàm / phương thức, lớp hoặc hằng.

  • Thử và sai là biện pháp cuối cùng của bạn.

Nếu vẫn thất bại, bạn luôn có thể google thông báo lỗi của bạn. Các biểu tượng cú pháp không dễ tìm kiếm (Bản thân Stack Overflow được lập chỉ mục bởi SymbolHound ). Do đó, có thể phải xem qua một vài trang nữa trước khi bạn tìm thấy một cái gì đó có liên quan.

Hướng dẫn thêm:

Màn hình trắng của cái chết

Nếu trang web của bạn trống, thì thông thường lỗi cú pháp là nguyên nhân. Cho phép hiển thị của họ với:

  • error_reporting = E_ALL
  • display_errors = 1

Nói php.inichung, hoặc thông qua .htaccessmod_php, hoặc thậm chí.user.ini với các thiết lập FastCGI.

Việc kích hoạt nó trong tập lệnh bị hỏng là quá muộn vì PHP thậm chí không thể diễn giải / chạy dòng đầu tiên. Một cách giải quyết nhanh là tạo ra một kịch bản lệnh bao bọc, nói test.php:

<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

Sau đó gọi mã lỗi bằng cách truy cập tập lệnh bao bọc này.

Nó cũng giúp kích hoạt PHP error_logvà xem xét máy chủ weberror.log của bạn khi tập lệnh gặp sự cố với phản hồi HTTP 500.


error_reporting(E_ALL | E_STRICT);cho các phiên bản trước của PHP
Geo

2
Một số IDE (như NetBeans) không chỉ hỗ trợ tô sáng cú pháp mà còn định dạng mã. Nếu bạn có thói quen định dạng mã của mình đúng cách và yêu cầu IDE định dạng lại trong trường hợp thỉnh thoảng bạn có thể gặp khó khăn để phát hiện ra các vấn đề như niềng răng chưa từng có.
Josep Valls

115

Tôi nghĩ chủ đề này là hoàn toàn quá mức / quá phức tạp. Sử dụng IDE là cách để tránh hoàn toàn bất kỳ lỗi cú pháp nào. Tôi thậm chí sẽ nói rằng làm việc mà không có IDE là không chuyên nghiệp. Tại sao? Bởi vì các IDE hiện đại kiểm tra cú pháp của bạn sau mỗi ký tự bạn nhập. Khi bạn mã và toàn bộ dòng của bạn chuyển sang màu đỏ và một thông báo cảnh báo lớn hiển thị cho bạn loại chính xác và vị trí chính xác của lỗi cú pháp, thì hoàn toàn không cần phải tìm kiếm giải pháp khác.

Sử dụng IDE kiểm tra cú pháp có nghĩa là:

Bạn sẽ không bao giờ gặp phải lỗi cú pháp nữa, đơn giản vì bạn thấy chúng đúng khi bạn nhập. Nghiêm túc.

IDE tuyệt vời với kiểm tra cú pháp (tất cả chúng đều có sẵn cho Linux, Windows và Mac):

  1. NetBeans [miễn phí]
  2. PHPStorm [$ 199 USD]
  3. Eclipse với Plugin PHP [miễn phí]
  4. Sublime [$ 80 USD] (chủ yếu là trình soạn thảo văn bản, nhưng có thể mở rộng bằng các plugin, như Trình phân tích cú pháp PHP )

2
Rõ ràng là như vậy. Tuy nhiên, các IDE đang tồn tại ở đây, bạn có thể giải thích một chút về sự hữu ích của cú pháp không? Sublime chủ yếu là một biên tập viên, không phải IDE; nhưng sau đó xinh hơn và linh hoạt hơn; không chủ yếu chỉ đánh dấu cú pháp nhưng cũng có thể xác thực khi khớp khung. Ví dụ, nó dễ dàng phát hiện ra các lỗi T_CONSTANT_AND_ENCAPSED, không giống như PHPStorm; tuy nhiên có nhiều dòng nguệch ngoạc hơn cho các lỗi nội tuyến. Các gợi ý cú pháp của NetBeans, được sử dụng để trở nên khó hiểu hơn so với PHP thậm chí (thay vào đó là các cấu trúc được phép). Bạn có thể chia sẻ kinh nghiệm của bạn về ưu / nhược điểm; Eclipse / PDT yêu thích của bạn hay ..?
mario

@mario Tôi nghĩ rằng bạn thực sự đi sâu vào chủ đề nên tôi thực sự không muốn nói gì sai ở đây, nhưng tất cả các mã tôi (và các đồng đội của tôi, bạn bè viết mã, đối tác tự do) đã từng viết trong IDE chưa bao giờ được thực thi với một lỗi cú pháp. Vì vậy, tôi nghĩ rằng ít nhất kiểm tra cú pháp của Netbeans / PHPStorm là cực kỳ mạnh mẽ. Nhưng có lẽ tôi đã đọc sai câu hỏi của bạn. Đưa tôi vài giờ ...;)
Sliq

Câu trả lời của bạn đã được đặt ra. Sẽ phù hợp với 99% câu hỏi của chúng tôi. Tuy nhiên, đối với bối cảnh ở đây, tôi muốn xem xét đánh đổi mà IDE cung cấp các công cụ thân thiện với người mới hơn . Nó có thể là nhỏ đối với chúng tôi, màu sắc và đường uốn lượn là đủ nếu bạn đủ thành thạo. Nhưng tôi cho rằng sự khác biệt có thể có ý nghĩa hơn đối với người mới bắt đầu.
mario

Đôi khi một IDE không phải là một lựa chọn khả thi. Ví dụ: thực hiện các chỉnh sửa nhanh chóng cho một chủ đề hoặc plugin WordPress. Có, tôi có thể sao chép tất cả mã vào IDE, nhưng sau đó tôi phải mở nó ra, dán tất cả vào đó, đặt tiêu đề và tất cả những thứ khác lãng phí thời gian, khi tôi chỉ hy vọng chỉnh sửa nhanh. Bây giờ, nếu bạn đang phát triển các tính năng mới hoặc bắt đầu từ đầu, thì, vâng, hãy làm điều đó trong IDE. Bạn sẽ không hối tiếc khi bắt đầu thêm chút thời gian đó để thiết lập nó.
1934286

Tôi thấy IDE là một trailer, không chỉ là một hộp công cụ. Nó có thể không CỐ ĐỊNH nhưng nó có thể giúp bạn tìm và ngăn ngừa lỗi cú pháp. Nhiều câu trả lời ở đây dường như nói rằng nếu bạn giữ mã sạch, bạn sẽ ít có lỗi hơn và dễ phát hiện hơn. Vâng, với thụt lề tự động, gợi ý mã, xuất hiện biến, dấu ngoặc tự động và định dạng tự động giúp tôi tiết kiệm nhiều lỗi chính tả mỗi ngày và là lợi thế chính tại sao tôi sử dụng một lỗi. Điều này không tính mọi thứ khác ngoài phạm vi của câu hỏi này (trình gỡ lỗi, trình kết nối cơ sở dữ liệu, sơ đồ uml, v.v.) IDE sẽ giúp bạn tiết kiệm thời gian và sẽ ngăn chặn nhiều hơn chỉ là lỗi cú pháp.
Louis Loudog Trottier

58

Bất ngờ [

Ngày nay, [khung mảng bất ngờ thường thấy trên các phiên bản PHP lỗi thời. Các cú pháp mảng ngắn là có sẵn từ PHP > = 5.4 . Cài đặt cũ chỉ hỗ trợ array().

$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
         

Tương tự kết quả chức năng mảng là không có sẵn cho các phiên bản PHP cũ hơn:

$result = get_whatever()["key"];
                      

Tham khảo - Lỗi này có ý nghĩa gì trong PHP? - "Lỗi cú pháp, không mong muốn \[" hiển thị các cách giải quyết phổ biến và thực tế nhất.

Mặc dù vậy, bạn luôn luôn tốt hơn là chỉ nâng cấp cài đặt PHP của mình. Đối với các gói webhosting được chia sẻ, nghiên cứu đầu tiên nếu SetHandler php56-fcgicó thể được sử dụng để cho phép thời gian chạy mới hơn.

Xem thêm:

BTW, cũng có bộ tiền xử lý và bộ chuyển đổi cú pháp PHP 5.4 nếu bạn thực sự bám víu với các phiên bản PHP cũ hơn + chậm hơn.

Các nguyên nhân khác gây bất ngờ[ lỗi cú pháp

Nếu đó không phải là phiên bản PHP không khớp, thì đó thường là lỗi chính tả hoặc lỗi người mới sử dụng:

  • Bạn không thể sử dụng khai báo / biểu thức thuộc tính mảng trong các lớp , thậm chí không phải trong PHP 7.

    protected $var["x"] = "Nope";
                  
  • Nhầm lẫn [với việc mở dấu ngoặc nhọn {hoặc dấu ngoặc đơn (là một giám sát phổ biến.

    foreach [$a as $b)
            

    Hoặc thậm chí:

    function foobar[$a, $b, $c] {
                   
  • Hoặc cố gắng hủy bỏ hằng số (trước PHP 5.6) dưới dạng mảng:

    $var = const[123];
           

    Ít nhất PHP diễn giải đó constlà một tên không đổi.

    Nếu bạn có ý định truy cập vào một biến mảng (đó là nguyên nhân điển hình ở đây), thì hãy thêm $sigil hàng đầu - để nó trở thành a $varname.

  • Bạn đang cố gắng sử dụng globaltừ khóa trên một thành viên của một mảng kết hợp. Đây không phải là cú pháp hợp lệ:

    global $var['key'];


Đóng cửa bất ngờ] khung vuông

Điều này có phần hiếm hơn, nhưng cũng có những tai nạn cú pháp với dấu ]ngoặc kết thúc .

  • Một lần nữa không khớp với )dấu ngoặc đơn hoặc }dấu ngoặc nhọn là phổ biến:

    function foobar($a, $b, $c] {
                              
  • Hoặc cố gắng kết thúc một mảng trong đó không có một mảng:

    $var = 2];

    Mà thường xảy ra trong khai báo mảng nhiều dònglồng nhau .

    $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
                                                 

    Nếu vậy, hãy sử dụng IDE của bạn để khớp khung để tìm bất kỳ ]đóng mảng sớm . Ít nhất hãy sử dụng nhiều khoảng cách và dòng mới để thu hẹp nó.


Liên kết 'PHP 5.4 cú pháp chuyển đổi xuống' github.com/I MuffBajescu/short-arrays -to- long-arrays ở trên bị hỏng.
Danimal Reks

46

T_VARIABLE bất ngờ

"Không mong muốn T_VARIABLE" có nghĩa là có một $variabletên theo nghĩa đen , không phù hợp với cấu trúc biểu thức / câu lệnh hiện tại.

Mục đích trừu tượng / toán tử không chính xác + sơ đồ biến $

  1. thiếu dấu chấm phẩy

    Nó phổ biến nhất chỉ ra một dấu chấm phẩy bị thiếu trong dòng trước. Các bài tập biến sau một câu lệnh là một chỉ báo tốt để tìm:

           
    func1()
    $var = 1 + 2;     # parse error in line +2
  2. Nối chuỗi

    Một rủi ro thường xuyên là nối chuỗi với .toán tử bị lãng quên :

                                   
    print "Here comes the value: "  $value;

    Btw, bạn nên thích nội suy chuỗi (biến cơ bản trong dấu ngoặc kép) bất cứ khi nào giúp dễ đọc. Mà tránh các vấn đề cú pháp.

    Nội suy chuỗi là một tính năng cốt lõi của ngôn ngữ kịch bản . Không có gì xấu hổ trong việc sử dụng nó. Bỏ qua bất kỳ lời khuyên tối ưu hóa vi mô nào về việc .ghép biến được nhanh hơn . Nó không thể.

  3. Thiếu toán tử biểu thức

    Tất nhiên, cùng một vấn đề có thể phát sinh trong các biểu thức khác, ví dụ như các phép toán số học:

               
    print 4 + 7 $var;

    PHP không thể đoán ở đây nếu biến nên được thêm, trừ hoặc so sánh, v.v.

  4. Danh sách

    Tương tự cho các danh sách cú pháp, như trong các quần thể mảng, trong đó trình phân tích cú pháp cũng chỉ ra một dấu phẩy dự kiến ,chẳng hạn:

                                          
    $var = array("1" => $val, $val2, $val3 $val4);

    Hoặc danh sách tham số chức năng:

                                    
    function myfunc($param1, $param2 $param3, $param4)

    Tương tự bạn có thấy điều này với listhoặc các globalcâu lệnh, hoặc khi thiếu ;dấu chấm phẩy trong một forvòng lặp.

  5. Khai báo lớp

    Lỗi trình phân tích cú pháp này cũng xảy ra trong khai báo lớp . Bạn chỉ có thể gán hằng số tĩnh, không phải biểu thức. Do đó, trình phân tích cú pháp phàn nàn về các biến như dữ liệu được gán:

    class xyz {      
        var $value = $_GET["input"];

    }Niềng răng đóng cửa chưa từng có đặc biệt có thể dẫn ở đây. Nếu một phương thức bị chấm dứt quá sớm (sử dụng thụt lề thích hợp!), Thì một biến đi lạc thường bị đặt sai vào phần khai báo lớp.

  6. Các biến sau khi định danh

    Bạn cũng không bao giờ có thể có một biến theo định danh trực tiếp:

                 
    $this->myFunc$VAR();

    Btw, đây là một ví dụ phổ biến trong đó ý định sử dụng các biến biến có lẽ. Trong trường hợp này, một tra cứu thuộc tính biến với $this->{"myFunc$VAR"}();ví dụ.

    Hãy nhớ rằng sử dụng các biến số nên là ngoại lệ. Những người mới đến thường cố gắng sử dụng chúng quá tình cờ, ngay cả khi mảng sẽ đơn giản và phù hợp hơn.

  7. Thiếu dấu ngoặc sau cấu trúc ngôn ngữ

    Gõ vội vã có thể dẫn đến việc mở quên hoặc đóng ngoặc cho ifforforeachtuyên bố:

           
    foreach $array as $key) {

    Giải pháp: thêm phần mở thiếu (giữa câu lệnh và biến.

                          
    if ($var = pdo_query($sql) {
         $result = 

    Dấu {ngoặc nhọn không mở khối mã, mà không đóng ifbiểu thức với )dấu ngoặc đơn đóng trước.

  8. Khác không mong đợi điều kiện

         
    else ($var >= 0)

    Giải pháp: Loại bỏ các điều kiện từ elsehoặc sử dụng elseif.

  9. Cần dấu ngoặc để đóng

         
    function() uses $var {}

    Giải pháp: Thêm dấu ngoặc xung quanh $var.

  10. Khoảng trắng vô hình

    Như đã đề cập trong câu trả lời tham khảo về "Unicode đi lạc vô hình" (chẳng hạn như không gian không phá vỡ ), bạn cũng có thể thấy lỗi này đối với mã không nghi ngờ như:

    <?php
                              
    $var = new PDO(...);

    Nó khá phổ biến khi bắt đầu các tệp và cho mã sao chép và dán. Kiểm tra với một hexeditor, nếu mã của bạn không xuất hiện trực quan để chứa một vấn đề cú pháp.

Xem thêm


32

Bất ngờ T_CONSTANT_ENCAPSED_STRING
Bất ngờ T_ENCAPSED_AND_WHITESPACE

Các tên khó sử dụng T_CONSTANT_ENCAPSED_STRINGT_ENCAPSED_AND_WHITESPACEđề cập đến chữ được trích dẫn ."string"

Chúng được sử dụng trong các bối cảnh khác nhau, nhưng vấn đề cú pháp khá giống nhau. Các cảnh báo của T_ENCAPSED xảy ra trong bối cảnh chuỗi được trích dẫn kép, trong khi các chuỗi T_CONSTANT thường bị lạc hướng trong các biểu thức hoặc câu lệnh PHP đơn giản.

  1. Nội suy biến không chính xác

    Và nó xuất hiện thường xuyên nhất cho phép nội suy biến PHP không chính xác:

                                   
    echo "Here comes a $wrong['array'] access";

    Trích dẫn các khóa mảng là điều bắt buộc trong ngữ cảnh PHP. Nhưng trong chuỗi trích dẫn kép (hoặc HEREDOC) thì đây là một sai lầm. Trình phân tích cú pháp phàn nàn về dấu ngoặc đơn được chứa 'string', bởi vì nó thường mong đợi một mã định danh / khóa theo nghĩa đen ở đó.

    Chính xác hơn là sử dụng cú pháp đơn giản theo kiểu PHP2 trong dấu ngoặc kép cho các tham chiếu mảng:

    echo "This is only $valid[here] ...";

    Các mảng lồng nhau hoặc các tham chiếu đối tượng sâu hơn tuy nhiên yêu cầu cú pháp biểu thức chuỗi xoăn phức tạp :

    echo "Use {$array['as_usual']} with curly syntax.";

    Nếu không chắc chắn, điều này thường an toàn hơn để sử dụng. Nó thường được coi là dễ đọc hơn. Và các IDE tốt hơn thực sự sử dụng màu sắc cú pháp riêng biệt cho điều đó.

  2. Thiếu kết nối

    Nếu một chuỗi tuân theo một biểu thức, nhưng thiếu một phép nối hoặc toán tử khác, thì bạn sẽ thấy PHP phàn nàn về chuỗi ký tự:

                           
    print "Hello " . WORLD  " !";

    Mặc dù rõ ràng đối với bạn và tôi, PHP chỉ không thể đoán rằng chuỗi có nghĩa là được nối vào đó.

  3. Bao vây chuỗi khó hiểu

    Lỗi cú pháp tương tự xảy ra khi phân cách chuỗi gây nhiễu . Một chuỗi bắt đầu bằng một trích dẫn đơn 'hoặc kép "cũng kết thúc bằng cùng một.

                    
    print "<a href="' . $link . '">click here</a>";
          ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟

    Ví dụ đó bắt đầu với dấu ngoặc kép. Nhưng dấu ngoặc kép cũng được dành cho các thuộc tính HTML. Tuy nhiên, toán tử ghép nối dự định trong phạm vi đã được hiểu là một phần của chuỗi thứ hai trong các dấu ngoặc đơn.

    Mẹo : Đặt trình soạn thảo / IDE của bạn để sử dụng màu sắc hơi khác biệt cho các chuỗi trích dẫn đơn và kép. (Nó cũng giúp với logic ứng dụng để ưu tiên ví dụ như các chuỗi được trích dẫn kép cho đầu ra văn bản và các chuỗi được trích dẫn duy nhất chỉ cho các giá trị giống như hằng số.)

    Đây là một ví dụ điển hình trong đó bạn không nên thoát ra khỏi dấu ngoặc kép ở vị trí đầu tiên. Thay vào đó, chỉ cần sử dụng các \"lối thoát thích hợp cho các thuộc tính HTML Báo giá của trích dẫn:

    print "<a href=\"{$link}\">click here</a>";

    Mặc dù điều này cũng có thể dẫn đến nhầm lẫn cú pháp, tất cả các IDE / trình soạn thảo tốt hơn một lần nữa giúp đỡ bằng cách tô màu các trích dẫn thoát khác nhau.

  4. Thiếu trích dẫn

    Tương tự bị quên mở "/ 'trích dẫn một công thức cho lỗi trình phân tích cú pháp:

                   
     make_url(login', 'open');

    Ở đây, ', 'nó sẽ trở thành một chuỗi ký tự sau một bareword, khi rõ ràng logincó nghĩa là một tham số chuỗi.

  5. Danh sách mảng

    Nếu bạn bỏ lỡ ,dấu phẩy trong khối tạo mảng, trình phân tích cú pháp sẽ thấy hai chuỗi liên tiếp:

    array(               
         "key" => "value"
         "next" => "....",
    );

    Lưu ý rằng dòng cuối cùng có thể luôn chứa một dấu phẩy thừa, nhưng nhìn ra một ở giữa là không thể tha thứ. Đó là khó để khám phá mà không làm nổi bật cú pháp.

  6. Danh sách tham số chức năng

    Điều tương tự cho các cuộc gọi chức năng :

                             
    myfunc(123, "text", "and"  "more")
  7. Dây chạy

    Một biến thể phổ biến là các đầu cuối chuỗi bị lãng quên khá đơn giản:

                                    
    mysql_evil("SELECT * FROM stuffs);
    print "'ok'";
          ⇑

    Ở đây PHP phàn nàn về hai chuỗi ký tự trực tiếp nối tiếp nhau. Nhưng nguyên nhân thực sự là chuỗi không được tiết lộ trước đó tất nhiên.

Xem thêm


27

T_STRING bất ngờ

T_STRINGlà một chút sai lầm. Nó không đề cập đến một trích dẫn "string". Nó có nghĩa là một định danh thô đã gặp phải. Điều này có thể bao gồm từ các baretừ còn lại CONSTANThoặc tên hàm, các chuỗi không được bỏ qua hoặc bất kỳ văn bản đơn giản nào.

  1. Chuỗi sai

    Tuy nhiên, lỗi cú pháp này là phổ biến nhất đối với các giá trị chuỗi bị trích dẫn sai. Bất kỳ sự bỏ qua và đi lạc "hoặc 'trích dẫn sẽ tạo thành một biểu thức không hợp lệ:

                                     
     echo "<a href="http://example.com">click here</a>";

    Cú pháp tô sáng sẽ làm cho những sai lầm như vậy siêu rõ ràng. Điều quan trọng cần nhớ để sử dụng backslashes cho thoát \"dấu ngoặc kép, hoặc \'dấu nháy đơn - trên phụ thuộc được sử dụng như là chuỗi bao vây .

    • Để thuận tiện, bạn nên ưu tiên các trích dẫn đơn bên ngoài khi xuất HTML đơn giản với các trích dẫn kép bên trong.
    • Sử dụng các chuỗi trích dẫn kép nếu bạn muốn nội suy các biến, nhưng sau đó xem ra để thoát khỏi "dấu ngoặc kép theo nghĩa đen .
    • Để đầu ra dài hơn, thích nhiều echo/ printdòng thay vì thoát ra và vào. Tốt hơn hết hãy xem xét một phần HEREDOC .

    Một ví dụ khác là sử dụng mục nhập PHP bên trong mã HTML được tạo bằng PHP:

    $text = '<div>some text with <?php echo 'some php entry' ?></div>'

    Điều này xảy ra nếu $textlớn với nhiều dòng và nhà phát triển không thấy toàn bộ giá trị biến PHP và tập trung vào đoạn mã mà quên về nguồn của nó. Ví dụ ở đây

    Xem thêm Sự khác biệt giữa các chuỗi trích dẫn đơn và trích dẫn kép trong PHP là gì? .

  2. Chuỗi không được tiết lộ

    Nếu bạn bỏ lỡ việc đóng" thì một lỗi cú pháp thường xảy ra sau đó. Một chuỗi bị hủy bỏ thường sẽ tiêu thụ một chút mã cho đến giá trị chuỗi dự định tiếp theo:

                                                           
    echo "Some text", $a_variable, "and some runaway string ;
    success("finished");
             ⇯

    Đó không chỉ là nghĩa đen T_STRINGmà trình phân tích cú pháp có thể phản đối sau đó. Một biến thể thường xuyên khác là một Unexpected '>'HTML không được trích dẫn.

  3. Báo giá chuỗi không lập trình

    Nếu bạn sao chép và dán mã từ blog hoặc trang web, đôi khi bạn kết thúc với mã không hợp lệ. Các trích dẫn chính tả không phải là những gì PHP mong đợi:

    $text = Something something..’ + these ain't quotes”;

    Báo giá typographic / thông minh là ký hiệu Unicode. PHP coi chúng như một phần của văn bản chữ và số liền kề. Ví dụ ”theseđược hiểu là một định danh không đổi. Nhưng bất kỳ văn bản nào sau đây được xem như là một bareword / T_STRING bởi trình phân tích cú pháp.

  4. Dấu chấm phẩy bị thiếu; lần nữa

    Nếu bạn có một biểu thức bị hủy trong các dòng trước đó, thì bất kỳ câu lệnh hoặc cấu trúc ngôn ngữ nào sau đây sẽ được xem là định danh thô:

           
    func1()
    function2();

    PHP chỉ không thể biết nếu bạn có ý định chạy hai hàm khác hay nếu bạn muốn nhân kết quả của chúng, thêm chúng, so sánh chúng hoặc chỉ chạy một ||hoặc hai chức năng khác.

  5. Thẻ mở ngắn và <?xml tiêu đề trong tập lệnh PHP

    Điều này là khá phổ biến. Nhưng nếu short_open_tags được bật, thì bạn không thể bắt đầu các tập lệnh PHP của mình bằng một khai báo XML :

          
    <?xml version="1.0"?>

    PHP sẽ thấy <?và lấy lại chính nó. Nó sẽ không hiểu xmlý nghĩa của việc đi lạc là gì. Nó sẽ được hiểu là hằng số. Nhưng ý versionchí sẽ được xem như một nghĩa đen / hằng số khác. Và vì trình phân tích cú pháp không thể hiểu hai chữ / giá trị tiếp theo mà không có toán tử biểu thức ở giữa, đó sẽ là một lỗi của trình phân tích cú pháp.

  6. Ký tự Unicode vô hình

    Một nguyên nhân gớm ghiếc nhất cho các lỗi cú pháp là các ký hiệu Unicode, chẳng hạn như không gian không phá vỡ . PHP cho phép các ký tự Unicode làm tên định danh. Nếu bạn nhận được một khiếu nại trình phân tích cú pháp T_STRING cho mã hoàn toàn không đáng tin cậy như:

    <?php
        print 123;

    Bạn cần phải thoát ra một trình soạn thảo văn bản khác. Hoặc một hexeditor thậm chí. Những gì trông giống như không gian đơn giản và dòng mới ở đây, có thể chứa hằng số vô hình. Các IDE dựa trên Java đôi khi không biết đến BOM UTF-8 được đặt trong các khoảng trắng có độ rộng bằng 0, dấu phân cách đoạn, v.v. Hãy thử làm lại mọi thứ, xóa khoảng trắng và thêm khoảng trắng bình thường trở lại.

    Bạn có thể thu hẹp nó bằng cách thêm các ;dấu tách câu lệnh dự phòng ở mỗi dòng bắt đầu:

    <?php
        ;print 123;

    ;Dấu chấm phẩy thừa ở đây sẽ chuyển đổi ký tự vô hình trước đó thành một tham chiếu không đổi không xác định (biểu thức dưới dạng câu lệnh). Đổi lại làm cho PHP tạo ra một thông báo hữu ích.

  7. Dấu `$` bị thiếu trước tên biến

    Các biến trong PHP được biểu thị bằng ký hiệu đô la theo sau là tên của biến.

    Ký hiệu đô la ( $) là một sigil đánh dấu định danh là tên của một biến. Không có sigil này, định danh có thể là một từ khóa ngôn ngữ hoặc một hằng số .

    Đây là một lỗi phổ biến khi mã PHP được "dịch" từ mã được viết bằng ngôn ngữ khác (C, Java, JavaScript, v.v.). Trong các trường hợp như vậy, một khai báo về loại biến (khi mã gốc được viết bằng ngôn ngữ sử dụng các biến được gõ) cũng có thể lẻn ra và tạo ra lỗi này.

  8. Dấu ngoặc kép thoát

    Nếu bạn sử dụng \trong một chuỗi, nó có một ý nghĩa đặc biệt. Đây được gọi là " Nhân vật thoát " và thường bảo trình phân tích cú pháp lấy ký tự tiếp theo theo nghĩa đen.

    Ví dụ: echo 'Jim said \'Hello\'';sẽ inJim said 'hello'

    Nếu bạn thoát khỏi trích dẫn kết thúc của một chuỗi, trích dẫn kết thúc sẽ được thực hiện theo nghĩa đen và không như dự định, tức là một trích dẫn có thể in như một phần của chuỗi và không đóng chuỗi. Điều này sẽ hiển thị như một lỗi phân tích thông thường sau khi bạn mở chuỗi tiếp theo hoặc ở cuối tập lệnh.

    Lỗi rất phổ biến khi chỉ định đường dẫn trong Windows: "C:\xampp\htdocs\"là sai. Bạn cần "C:\\xampp\\htdocs\\".


18

Bất ngờ (

Các dấu ngoặc đơn mở thường theo các cấu trúc ngôn ngữ như if/ foreach/ for/ array/ listhoặc bắt đầu một biểu thức số học. Chúng về mặt cú pháp không chính xác sau "strings", trước đó (), đơn độc $và trong một số bối cảnh khai báo điển hình.

  1. Các tham số khai báo hàm

    Một sự cố hiếm gặp hơn cho lỗi này là cố gắng sử dụng các biểu thức làm tham số hàm mặc định . Điều này không được hỗ trợ, ngay cả trong PHP7:

    function header_fallback($value, $expires = time() + 90000) {

    Các tham số trong khai báo hàm chỉ có thể là giá trị bằng chữ hoặc biểu thức hằng. Không giống như các yêu cầu chức năng, nơi bạn có thể tự do sử dụng whatever(1+something()*2), v.v.

  2. Mặc định tài sản hạng

    Điều tương tự đối với khai báo thành viên lớp , trong đó chỉ cho phép các giá trị bằng chữ / hằng, không cho phép biểu thức:

    class xyz {                   
        var $default = get_config("xyz_default");

    Đặt những thứ như vậy trong các nhà xây dựng. Xem thêm Tại sao các thuộc tính PHP không cho phép các hàm?

    Một lần nữa lưu ý rằng PHP 7 chỉ cho phép các var $xy = 1 + 2 +3;biểu thức không đổi ở đó.

  3. Cú pháp JavaScript trong PHP

    Sử dụng cú pháp JavaScript hoặc jQuery sẽ không hoạt động trong PHP vì những lý do rõ ràng:

    <?php      
        print $(document).text();

    Khi điều này xảy ra, nó thường chỉ ra một chuỗi trước bị hủy bỏ; và <script>các phần chữ bị rò rỉ vào bối cảnh mã PHP.

  4. isset (()), trống, khóa, tiếp theo, hiện tại

    Cả hai isset()empty()là ngôn ngữ tích hợp, không phải chức năng. Họ cần truy cập một biến trực tiếp . Nếu bạn vô tình thêm một cặp dấu ngoặc quá nhiều, thì bạn sẽ tạo một biểu thức tuy nhiên:

              
    if (isset(($_GET["id"]))) {

    Điều tương tự áp dụng cho bất kỳ cấu trúc ngôn ngữ nào yêu cầu truy cập tên biến ẩn. Những phần dựng sẵn này là một phần của ngữ pháp ngôn ngữ, do đó không cho phép dấu ngoặc đơn trang trí thêm.

    Các hàm cấp người dùng yêu cầu tham chiếu biến -nhưng có kết quả biểu thức được truyền - dẫn đến lỗi thời gian chạy thay thế.


Bất ngờ )

  1. Tham số chức năng vắng mặt

    Bạn không thể có dấu phẩy đi lạc cuối cùng trong một cuộc gọi chức năng . PHP mong đợi một giá trị ở đó và do đó phàn nàn về )dấu ngoặc đơn đóng sớm .

                  
    callfunc(1, 2, );

    Dấu phẩy chỉ được phép trong array()hoặc list()cấu trúc.

  2. Biểu hiện dở dang

    Nếu bạn quên một cái gì đó trong một biểu thức số học, thì trình phân tích cú pháp sẽ bỏ cuộc. Bởi vì làm thế nào nó có thể giải thích rằng:

                   
    $var = 2 * (1 + );

    Và nếu bạn quên đóng cửa )ngay cả, thì bạn sẽ nhận được một khiếu nại về dấu chấm phẩy bất ngờ thay thế.

  3. Thuyết minh như constant

    Đối với các $tiền tố biến bị quên trong các câu lệnh điều khiển, bạn sẽ thấy:

                           
    foreach ($array as wrong) {

    PHP ở đây đôi khi cho bạn biết nó mong đợi một ::thay thế. Bởi vì một biến lớp :: $ có thể đã thỏa mãn biểu thức biến $ mong đợi ..


Bất ngờ {

Niềng răng xoăn {}kèm theo khối mã. Và lỗi cú pháp về chúng thường chỉ ra một số lồng không chính xác.

  1. Subexpressions chưa từng có trong một if

    Thông thường nhất là không cân bằng () là nguyên nhân nếu trình phân tích cú pháp phàn nàn về việc mở xoăn {xuất hiện quá sớm. Một ví dụ đơn giản:

                                  
    if (($x == $y) && (2 == true) {

    Đếm dấu ngoặc đơn của bạn hoặc sử dụng IDE giúp điều đó. Cũng đừng viết mã mà không có khoảng trắng. Tính dễ đọc.

  2. {và} trong ngữ cảnh biểu thức

    Bạn không thể sử dụng dấu ngoặc nhọn trong biểu thức. Nếu bạn nhầm lẫn dấu ngoặc đơn và xoăn, nó sẽ không tuân thủ ngữ pháp ngôn ngữ:

               
    $var = 5 * {7 + $x};

    Có một vài ngoại lệ cho việc xây dựng định danh, chẳng hạn như biến phạm vi cục bộ ${references}.

  3. Biến biến hoặc biểu thức var xoăn

    Điều này là khá hiếm. Nhưng bạn cũng có thể nhận {}phân tích các khiếu nại cho các biểu thức biến phức tạp:

                          
    print "Hello {$world[2{]} !";

    Mặc dù có khả năng cao hơn cho một bất ngờ }trong bối cảnh như vậy.


Bất ngờ }

Khi gặp }lỗi " không mong muốn ", bạn hầu như đã đóng một khối mã quá sớm.

  1. Câu lệnh cuối cùng trong một khối mã

    Nó có thể xảy ra cho bất kỳ biểu hiện unterminated.

    Và nếu dòng cuối cùng trong khối chức năng / mã thiếu dấu ;chấm phẩy:

    function whatever() {
        doStuff()
    }            

    Ở đây trình phân tích cú pháp không thể cho biết nếu bạn có thể vẫn muốn thêm + 25;vào kết quả hàm hoặc một cái gì đó khác.

  2. Lồng ghép không hợp lệ / Quên {

    Đôi khi bạn sẽ thấy lỗi trình phân tích cú pháp này khi một khối mã bị }đóng quá sớm hoặc bạn đã quên mở {ngay cả:

    function doStuff() {
        if (true)    
            print "yes";
        }
    }   

    Trong đoạn trích trên, ifkhông có một {dấu ngoặc nhọn mở . Do đó, việc đóng cửa }dưới đây trở nên dư thừa. Và do đó, lần đóng tiếp theo }, được dành cho chức năng, không thể kết hợp với {dấu ngoặc nhọn mở đầu .

    Những lỗi như vậy thậm chí còn khó tìm hơn nếu không có mã thụt lề thích hợp. Sử dụng IDE và khớp khung.


Thật bất ngờ {, mong chờ(

Các cấu trúc ngôn ngữ yêu cầu tiêu đề điều kiện / khai báo khối mã sẽ gây ra lỗi này.

  1. Danh sách tham số

    Ví dụ, các hàm bị đánh giá sai không có danh sách tham số không được phép:

                     
    function whatever {
    }
  2. Điều kiện tuyên bố kiểm soát

    Và bạn không thể có một ifđiều kiện mà không có điều kiện .

      
    if {
    }

    Điều đó không có ý nghĩa, rõ ràng. Điều tương tự cho các nghi phạm thông thường, for/ foreach, while/ do, v.v.

    Nếu bạn gặp phải lỗi đặc biệt này, bạn chắc chắn nên tìm kiếm một số ví dụ thủ công.


1
Đã tìm kiếm câu trả lời cho câu hỏi của tôi trong bài đăng này, nhưng tôi đã tìm thấy câu trả lời cho vấn đề của - "Thật bất ngờ {", đó là lý do tại sao tôi muốn chia sẻ với câu trả lời của mình - đối với tôi, vấn đề là mã hóa ngắt dòng - bằng cách nào đó các tệp đang sử dụng ngắt dòng macffy, nhưng khi tôi thay đổi chúng thành ngắt dòng windows - vấn đề của tôi (trên localhost (WAMP) mọi thứ đều hoạt động, nhưng trên máy chủ web linux thì không) đã được giải quyết.
Edgars Aivars

@EdgarsAivars Cảm ơn bình luận của bạn! Các ngắt dòng dành riêng cho nền tảng thực sự là một vấn đề không phổ biến và khó khăn. Có lẽ tôi cũng sẽ đề cập đến nó trong đây. (Nó chỉ được đề cập như là một bên trong câu trả lời tham khảo khác .)
mario

Tôi thấy rằng việc không mong đợi} là do một đoạn mã của tôi đã sử dụng thẻ ngắn php <? thay vì <? php - tôi mất một lúc để tìm cái này vì nó hoạt động trên các máy chủ khác.
c7borg

14

$ Kết thúc bất ngờ

Khi PHP nói về một "điều không mong muốn $end", điều đó có nghĩa là mã của bạn kết thúc sớm. (Thông báo có một chút sai lệch khi được thực hiện theo nghĩa đen. Đây không phải là về một biến có tên "$ end", như đôi khi được giả định bởi những người mới. Nó đề cập đến "phần cuối của tệp" , EOF.)

Nguyên nhân: Không cân bằng {}cho các khối mã / và khai báo hàm hoặc lớp.

Gần như luôn luôn có một }dấu ngoặc nhọn bị thiếu để đóng các khối mã trước đó.

  • Một lần nữa, sử dụng thụt lề thích hợp để tránh các vấn đề như vậy.

  • Sử dụng một IDE có khớp khung, để tìm ra vị trí }không phù hợp . Có các phím tắt trong hầu hết các IDE và trình soạn thảo văn bản:

    • NetBeans, PhpStorm, Komodo: Ctrl[Ctrl]
    • Nhật thực, Aptana: CtrlShiftP
    • Nguyên tử, cao siêu: Ctrlm- Zend StudioCtrlM
    • Geany, Notepad ++: CtrlB- Joe: CtrlG- Emacs: C-M-n- Vim:%

Hầu hết các IDE cũng làm nổi bật dấu ngoặc nhọn, dấu ngoặc và dấu ngoặc đơn. Điều này làm cho nó khá dễ dàng để kiểm tra mối tương quan của chúng:

Khớp nối trong IDE

Biểu thức chưa hoàn thành

Unexpected $endlỗi cú pháp / trình phân tích cú pháp cũng có thể xảy ra đối với các biểu thức hoặc câu lệnh bị hủy bỏ:

  • $var = func(1, ?>EOF

Vì vậy, nhìn vào phần cuối của kịch bản đầu tiên. Một dấu vết ;thường là dư thừa cho câu lệnh cuối cùng trong bất kỳ tập lệnh PHP nào. Nhưng bạn nên có một cái. Chính xác bởi vì nó thu hẹp các vấn đề cú pháp như vậy xuống.

Dấu HEREDOC thụt lề

Một sự xuất hiện phổ biến khác xuất hiện với các chuỗi HEREDOC hoặc NOWDOC . Dấu chấm dứt bị bỏ qua với các khoảng trắng, tab, v.v.:

print <<< END
    Content...
    Content....
  END;
# ↑ terminator isn't exactly at the line start

Do đó, trình phân tích cú pháp giả định chuỗi HEREDOC tiếp tục cho đến khi kết thúc tệp (do đó "Không mong đợi $ end"). Khá nhiều tất cả các IDE và các trình soạn thảo làm nổi bật cú pháp sẽ làm cho điều này trở nên rõ ràng hoặc cảnh báo về nó.

Dấu ngoặc kép thoát

Nếu bạn sử dụng \trong một chuỗi, nó có một ý nghĩa đặc biệt. Đây được gọi là " Ký tự thoát " và thường bảo trình phân tích cú pháp lấy ký tự tiếp theo theo nghĩa đen.

Ví dụ: echo 'Jim said \'Hello\'';sẽ inJim said 'hello'

Nếu bạn thoát khỏi trích dẫn kết thúc của một chuỗi, trích dẫn kết thúc sẽ được thực hiện theo nghĩa đen và không như dự định, tức là một trích dẫn có thể in như một phần của chuỗi và không đóng chuỗi. Điều này sẽ hiển thị như một lỗi phân tích thông thường sau khi bạn mở chuỗi tiếp theo hoặc ở cuối tập lệnh.

Lỗi rất phổ biến khi chỉ định đường dẫn trong Windows: "C:\xampp\htdocs\"là sai. Bạn cần "C:\\xampp\\htdocs\\".

Cú pháp thay thế

Hơi hiếm khi bạn có thể thấy lỗi cú pháp này khi sử dụng cú pháp thay thế cho các khối lệnh / mã trong các mẫu. Sử dụng if:else:mất tíchendif; ví dụ.

Xem thêm:


14

Bất ngờ T_IF
Bất ngờ T_ELSEIF T_ELSE
bất ngờ
bất ngờ T_ENDIF

Khối điều khiển có điều kiện if, elseifelsetheo một cấu trúc đơn giản. Khi bạn gặp lỗi cú pháp, rất có thể đó chỉ là khối lồng không hợp lệ → thiếu {dấu ngoặc nhọn }- hoặc quá nhiều.

nhập mô tả hình ảnh ở đây

  1. Thiếu {hoặc }do thụt không chính xác

    Các dấu ngoặc mã không khớp là phổ biến đối với mã có định dạng kém hơn, chẳng hạn như:

    if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
    ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){

    Nếu mã của bạn trông như thế này, hãy bắt đầu lại từ đầu! Nếu không, nó không thể kết hợp với bạn hoặc bất cứ ai khác. Không có điểm nào trong việc hiển thị điều này trên internet để yêu cầu giúp đỡ.

    Bạn sẽ chỉ có thể sửa nó, nếu bạn có thể theo dõi trực quan cấu trúc lồng nhau và mối quan hệ của if / other điều kiện và {khối mã của chúng }. Sử dụng IDE của bạn để xem tất cả chúng có được ghép nối không.

    if (true) {
         if (false) {
                  
         }
         elseif ($whatever) {
             if ($something2) {
                 
             } 
             else {
                 
             }
         }
         else {
             
         }
         if (false) {    //   a second `if` tree
             
         }
         else {
             
         }
    }
    elseif (false) {
        
    }

    Bất kỳ đôi nào } }sẽ không chỉ đóng một nhánh, mà là một cấu trúc điều kiện trước đó. Do đó gắn bó với một phong cách mã hóa; không trộn và kết hợp trong các cây nếu / khác lồng nhau.

    Ngoài sự nhất quán ở đây, nó cũng hữu ích để tránh các điều kiện dài quá. Sử dụng các biến hoặc hàm tạm thời để tránh các ifbiểu hiện không thể đọc được .

  2. IF không thể được sử dụng trong các biểu thức

    Một lỗi người mới thường xuyên đáng ngạc nhiên là cố gắng sử dụng một ifcâu lệnh trong một biểu thức, chẳng hạn như một câu lệnh in:

                       
    echo "<a href='" . if ($link == "example.org") { echo 

    Tất nhiên là không hợp lệ.

    Bạn có thể sử dụng một điều kiện ternary , nhưng hãy cẩn thận với các tác động dễ đọc.

    echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";

    Mặt khác, phá vỡ các cấu trúc đầu ra như vậy: sử dụng nhiều ifs và echos .
    Tốt hơn hết, hãy sử dụng các biến tạm thời và đặt các điều kiện của bạn trước:

    if ($link) { $href = "yes"; } else { $href = "no"; }
    echo "<a href='$href'>Link</a>";

    Xác định hàm hoặc phương thức cho các trường hợp như vậy thường có ý nghĩa quá.

    Khối điều khiển không trả về "kết quả"

    Bây giờ điều này ít phổ biến hơn, nhưng một vài lập trình viên thậm chí cố gắng xử lý ifnhư thể nó có thể trả về một kết quả :

    $var = if ($x == $y) { "true" };

    Đó là cấu trúc giống hệt với việc sử dụng iftrong một chuỗi / biểu thức nối chuỗi.

    • Nhưng cấu trúc điều khiển (nếu / foreach / while) không có "kết quả" .
    • Chuỗi ký tự "true" cũng sẽ chỉ là một câu lệnh void.

    Bạn sẽ phải sử dụng một bài tập trong khối mã :

    if ($x == $y) { $var = "true"; }

    Ngoài ra, sử dụng một ?:so sánh ternary.

    Nếu trong Nếu

    Bạn không thể lồngif trong một điều kiện:

                        
    if ($x == true and (if $y != false)) { ... }

    Điều này rõ ràng là dư thừa, bởi vì and(hoặc or) đã cho phép so sánh chuỗi.

  3. ;Dấu chấm phẩy bị lãng quên

    Một lần nữa: Mỗi khối điều khiển cần phải là một tuyên bố. Nếu đoạn mã trước không bị chấm dứt bởi dấu chấm phẩy, thì đó là lỗi cú pháp được bảo đảm:

                    
    $var = 1 + 2 + 3
    if (true) {  }

    Btw, dòng cuối cùng trong một {…}khối mã cũng cần một dấu chấm phẩy.

  4. Dấu chấm phẩy quá sớm

    Bây giờ có lẽ sai lầm khi đổ lỗi cho một phong cách mã hóa cụ thể, vì cạm bẫy này quá dễ bỏ qua:

                
    if ($x == 5);
    {
        $y = 7;
    }
    else           
    {
        $x = -1;    
    }

    Điều đó xảy ra thường xuyên hơn bạn có thể tưởng tượng.

    • Khi bạn chấm dứt if ()biểu thức với; nó sẽ thực thi một câu lệnh void. Việc ;trở thành một khoảng trống {}của riêng nó!
    • Các {…}khối như vậy được tách ra khỏi if, và sẽ luôn luôn chạy.
    • Vì vậy, elsekhông còn có mối quan hệ với ifcấu trúc mở , đó là lý do tại sao điều này sẽ dẫn đến lỗi cú pháp T_ELSE không mong đợi.

    Điều này cũng giải thích một biến thể tinh tế tương tự của lỗi cú pháp này:

    if ($x) { x_is_true(); }; else { something_else(); };

    Trường hợp ;khối mã sau {…}kết thúc toàn bộ if cấu trúc, cắt elsenhánh theo cú pháp.

  5. Không sử dụng khối mã

    Nó cú pháp cho phép bỏ qua dấu ngoặc nhọn {... }cho các khối mã trong if/ elseif/ elsechi nhánh. Đáng buồn thay, một kiểu cú pháp rất phổ biến đối với các lập trình viên không đảo ngược. (Theo giả định sai, việc này nhanh hơn để gõ hoặc đọc).

    Tuy nhiên, điều đó rất có khả năng làm tăng cú pháp. Sớm hay muộn các câu lệnh bổ sung sẽ tìm đường vào nhánh if / other:

    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     
    else
        $z = 0;

    Nhưng để thực sự sử dụng khối mã, bạn nào có để ghi {... }họ như vậy!

    Ngay cả các lập trình viên dày dạn cũng tránh cú pháp không cần thiết này, hoặc ít nhất hiểu nó là một ngoại lệ đặc biệt đối với quy tắc.

  6. Khác / Khác theo thứ tự sai

    Một điều cần nhắc nhở bản thân là thứ tự có điều kiện , tất nhiên.

    if ($a) {  }
    else {  }
    elseif ($b) {  }
    

    Bạn có thể có nhiều elseifs như bạn muốn, nhưng elsephải đi sau cùng . Đó chỉ là cách nó được.

  7. Khai báo lớp

    Như đã đề cập ở trên , bạn không thể có các câu lệnh điều khiển trong một khai báo lớp:

    class xyz {
        if (true) {
            function ($var) {}
        }

    Bạn đã quên một định nghĩa hàm hoặc đóng }quá sớm trong các trường hợp như vậy.

  8. T_ELSEIF / T_ELSE bất ngờ

    Khi trộn PHP và HTML, việc đóng }cho một if/elseifphải nằm trong cùng một khối PHP <?php ?>như tiếp theo elseif/else. Điều này sẽ tạo ra lỗi khi đóng }cho các ifnhu cầu là một phần của elseif:

    <?php if ($x) { ?>
        html
    <?php } ?>
    <?php elseif ($y) { ?>
        html
    <?php } ?>

    Các hình thức chính xác <?php } elseif:

    <?php if ($x) { ?>
        html
    <?php } elseif ($y) { ?>
        html
    <?php } ?>

    Đây ít nhiều là một biến thể của thụt lề không chính xác - có lẽ thường dựa trên ý định mã hóa sai.
    Bạn không thể nghiền nát báo cáo khác Inbetween ifelseif/ elsethẻ cấu trúc:

    if (true) {
    }
    echo "in between";    
    elseif (false) {
    }
    ?> text <?php      
    else {
    }

    Hoặc chỉ có thể xảy ra trong {…}các khối mã, không phải ở giữa các mã thông báo cấu trúc điều khiển.

    • Điều này sẽ không có ý nghĩa nào. Không giống như có một số trạng thái "không xác định" khi PHP nhảy giữa ifelsecác nhánh.
    • Bạn sẽ phải quyết định nơi các câu lệnh in thuộc về / hoặc nếu chúng cần được lặp lại ở cả hai nhánh.

    Bạn cũng không thể chia phần if / other giữa các cấu trúc điều khiển khác nhau:

    foreach ($array as $i) {
        if ($i) {  }
    }
    else {  }

    Không có mối quan hệ cú pháp giữa ifelse. Các foreachphạm vi từ vựng đầu tại }, do đó không có điểm cho ifcấu trúc để tiếp tục.

  9. T_ENDIF

    Nếu một T_ENDIF bất ngờ bị khiếu nại, bạn đang sử dụng phong cách cú pháp thay thế if:elseif:else:endif;. Mà bạn thực sự nên suy nghĩ hai lần về.

    • Một cạm bẫy phổ biến là nhầm lẫn đại tràng tương tự:; kỳ lạ cho một dấu chấm phẩy . (Được đề cập trong "Dấu chấm phẩy quá sớm")

    • Vì thụt lề khó theo dõi hơn trong các tệp mẫu, nên càng sử dụng cú pháp thay thế - điều đó hợp lý của bạn endif;không khớp với bất kỳ if:.

    • Sử dụng } endif; là một -terminator nhân đôi if .

    Trong khi một "kết thúc $ bất ngờ" thường là giá cho một }cú đúp xoăn bị lãng quên .

  10. Chuyển nhượng so với so sánh

    Vì vậy, đây không phải là một lỗi cú pháp, nhưng đáng nói trong bối cảnh này:

           
    if ($x = true) { }
    else { do_false(); }

    Đó không phải là ==/ ===so sánh, mà là một =bài tập . Điều này khá tinh tế và sẽ dễ dàng khiến một số người dùng bất lực chỉnh sửa toàn bộ các khối điều kiện. Trước tiên hãy coi chừng các bài tập ngoài ý muốn - khi bạn gặp phải lỗi logic / lỗi sai.


11

T_IS_EQUAL bất ngờ
T_IS_GREATER_OR_EQUAL bất ngờ
bất ngờ T_IS_IDENTICAL
T_IS_NOT_EQUAL bất ngờ
T_IS_NOT_IDENTICAL bất ngờ
T_IS_SMALLER_OR_EQUAL bất ngờ
bất ngờ <
bất ngờ>

Toán tử so sánh như ==, >=, ===, !=, <>, !==<=hay <>chủ yếu nên được sử dụng chỉ trong các biểu thức, chẳng hạn như ifbiểu thức. Nếu trình phân tích cú pháp phàn nàn về chúng, thì điều đó thường có nghĩa là các phép so sánh không đúng hoặc không khớp ( )xung quanh chúng.

  1. Nhóm Parens

    Đặc biệt đối với các ifcâu lệnh có nhiều so sánh, bạn phải cẩn thận để đếm chính xác mở và đóng dấu ngoặc đơn :

                            
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          

    Ở đây ifđiều kiện ở đây đã được chấm dứt bởi)

    Khi các so sánh của bạn trở nên đủ phức tạp, nó thường giúp phân chia nó thành nhiều ifcấu trúc và lồng nhau hơn.

  2. isset () nghiền với so sánh

    Một người mới phổ biến là pitfal đang cố gắng kết hợp isset()hoặc empty()so sánh:

                            
    if (empty($_POST["var"] == 1)) {

    Hoặc thậm chí:

                        
    if (isset($variable !== "value")) {

    Điều này không có ý nghĩa với PHP, bởi vì issetemptylà các cấu trúc ngôn ngữ chỉ chấp nhận tên biến. Không có nghĩa gì để so sánh kết quả, bởi vì đầu ra chỉ / đã là một boolean.

  3. Nhầm lẫn >=lớn hơn hoặc bằng với =>toán tử mảng

    Cả hai toán tử trông hơi giống nhau, vì vậy đôi khi chúng bị lẫn lộn:

             
    if ($var => 5) { ... }

    Bạn chỉ cần nhớ rằng toán tử so sánh này được gọi là " lớn hơn hoặc bằng " để làm cho đúng.

    Xem thêm: Nếu cấu trúc câu lệnh trong PHP

  4. Không có gì để so sánh với

    Bạn cũng không thể kết hợp hai phép so sánh nếu chúng có cùng tên biến:

                     
    if ($xyz > 5 and < 100)

    PHP không thể suy luận rằng bạn muốn so sánh biến ban đầu một lần nữa. Các biểu thức thường được ghép nối theo mức độ ưu tiên của toán tử , do đó, tại thời điểm <được nhìn thấy, sẽ chỉ còn một kết quả boolean từ biến ban đầu.

    Xem thêm: T_IS_SMALLER_OR_EQUAL bất ngờ

  5. Chuỗi so sánh

    Bạn không thể so sánh với một biến với một hàng toán tử:

                      
     $reult = (5 < $x < 10);

    Điều này phải được chia thành hai so sánh, mỗi so sánh $x.

    Đây thực sự là một trường hợp của các biểu thức được liệt kê trong danh sách đen (do tính kết hợp toán tử tương đương). Nó có giá trị về mặt cú pháp trong một vài ngôn ngữ kiểu C, nhưng PHP cũng sẽ không hiểu nó là chuỗi so sánh dự kiến.

  6. Bất >
    ngờ bất ngờ<

    Lớn hơn >hoặc ít hơn các <nhà khai thác không có T_XXXtên mã thông báo tùy chỉnh . Và trong khi chúng có thể bị đặt sai vị trí như tất cả những người khác, bạn thường thấy trình phân tích cú pháp phàn nàn về chúng vì các chuỗi bị trích dẫn sai và HTML bị nghiền nát:

                            
    print "<a href='z">Hello</a>";
                     ↑

    Điều này có nghĩa là một chuỗi "<a href='z"được so sánh >với một hằng số theo nghĩa đen Hellovà sau đó là một <so sánh khác . Hoặc ít nhất đó là cách PHP nhìn thấy nó. Nguyên nhân thực tế và lỗi cú pháp là "chấm dứt chuỗi sớm .

    Cũng không thể lồng các thẻ bắt đầu PHP:

    <?php echo <?php my_func(); ?>

Xem thêm:


11

Bất ngờ T_IF
Bất ngờ T_FOREACH
Bất ngờ T_FOR
Bất ngờ T_WHILE
Bất ngờ T_DO
Bất ngờ T_ECHO

Kiểm soát xây dựng như if, foreach, for, while, list, global, return, do, print, echochỉ có thể được sử dụng như báo cáo. Họ thường cư trú trên một dòng một mình.

  1. Dấu chấm phẩy; Bạn đang ở đâu?

    Khá phổ biến là bạn đã bỏ lỡ một dấu chấm phẩy ở dòng trước nếu trình phân tích cú pháp phàn nàn về câu lệnh điều khiển:

                 
    $x = myfunc()
    if (true) {

    Giải pháp: nhìn vào dòng trước; thêm dấu chấm phẩy.

  2. Khai báo lớp

    Một vị trí khác nơi điều này xảy ra là trong khai báo lớp . Trong phần lớp, bạn chỉ có thể liệt kê các khởi tạo thuộc tính và các phần phương thức. Không có mã có thể nằm ở đó.

    class xyz {
        if (true) {}
        foreach ($var) {}

    Lỗi cú pháp như vậy thường được cụ thể hóa cho lồng không chính xác {}. Đặc biệt khi các khối mã chức năng đã đóng quá sớm.

  3. Báo cáo trong ngữ cảnh biểu thức

    Hầu hết các cấu trúc ngôn ngữ chỉ có thể được sử dụng như các câu lệnh . Chúng không có nghĩa là được đặt bên trong các biểu thức khác:

                       
    $var = array(1, 2, foreach($else as $_), 5, 6);

    Tương tự như vậy, bạn không thể sử dụng một ifchuỗi, biểu thức toán học hoặc ở nơi khác:

                   
    print "Oh, " . if (true) { "you!" } . " won't work";
    // Use a ternary condition here instead, when versed enough.

    Đối với các ifđiều kiện giống như nhúng trong một biểu thức cụ thể, bạn thường muốn sử dụng một ?:đánh giá tạm thời .

    Điều tương tự cũng áp dụng cho for, while, global, echovà một mức độ thấp hơn list.

              
    echo 123, echo 567, "huh?";

    Trong khi đó, print()một ngôn ngữ tích hợp có thể được sử dụng trong ngữ cảnh biểu thức. (Nhưng hiếm khi có ý nghĩa.)

  4. Từ khóa dành riêng làm định danh

    Bạn cũng không thể sử dụng dohoặc ifvà các cấu trúc ngôn ngữ khác cho các hàm hoặc tên lớp do người dùng định nghĩa. (Có lẽ trong PHP 7. Nhưng ngay cả sau đó nó sẽ không được khuyến khích.)


7

Bất ngờ '?'

Nếu bạn đang cố gắng sử dụng toán tử hợp nhất null ??trong phiên bản PHP trước PHP 7, bạn sẽ gặp lỗi này.

<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP

Thật bất ngờ '?', Mong đợi biến

Một lỗi tương tự có thể xảy ra đối với các loại nullable, như trong:

function add(?int $sum): ?int {

Một lần nữa chỉ ra một phiên bản PHP lỗi thời đang được sử dụng (phiên bản CLI php -vhoặc máy chủ web bị ràng buộc phpinfo();).


5

T_LNUMBER bất ngờ

Mã thông báo T_LNUMBERđề cập đến một "dài" / số.

  1. Tên biến không hợp lệ

    Trong PHP và hầu hết các ngôn ngữ lập trình khác, các biến không thể bắt đầu bằng một số. Ký tự đầu tiên phải là chữ cái hoặc dấu gạch dưới.

    $1   // Bad
    $_1  // Good

    *

    • Khá thường xuyên xuất hiện để sử dụng preg_replace-placeholder "$1"trong ngữ cảnh PHP:

      #                         ↓            ⇓  ↓
      preg_replace("/#(\w+)/e",  strtopupper($1) )

      Trường hợp gọi lại nên được trích dẫn. (Bây giờ /ecờ regex đã bị phản đối. Nhưng đôi khi nó vẫn bị sử dụng sai trong các preg_replace_callbackchức năng.)

    • Ràng buộc định danh tương tự áp dụng cho các thuộc tính đối tượng , btw.

             
      $json->0->value
    • Mặc dù mã thông báo / trình phân tích cú pháp không cho phép một chữ theo $1tên biến, người ta có thể sử dụng ${1}hoặc ${"1"}. Đó là một cách giải quyết cú pháp cho các định danh không chuẩn. (Tốt nhất nên nghĩ về nó như một tra cứu phạm vi cục bộ. Nhưng nói chung: thích các mảng đơn giản cho các trường hợp như vậy!)

    • Thật thú vị, nhưng rất không được khuyến khích, trình phân tích cú pháp PHP cho phép định danh Unicode; như vậy $➊sẽ hợp lệ (Không giống như một nghĩa đen 1).

  2. Nhập mảng

    Một khoảng thời gian dài bất ngờ cũng có thể xảy ra đối với khai báo mảng - khi thiếu ,dấu phẩy:

    #            ↓ ↓
    $xy = array(1 2 3);

    Hoặc các hàm gọi và khai báo tương tự, và các cấu trúc khác:

    • func(1, 2 3);
    • function xy($z 2);
    • for ($i=2 3<$z)

    Vì vậy, thường có một ;hoặc ,thiếu để phân tách danh sách hoặc biểu thức.

  3. HTML bị trích dẫn sai

    Và một lần nữa, các chuỗi bị trích dẫn sai là nguồn thường xuyên của các số đi lạc:

    #                 ↓ ↓          
    echo "<td colspan="3">something bad</td>";

    Những trường hợp như vậy nên được xử lý ít nhiều như lỗi T_STRING không mong đợi .

  4. Các định danh khác

    Cả hai hàm, lớp và không gian tên đều có thể được đặt tên bắt đầu bằng một số:

             
    function 123shop() {

    Khá giống với tên biến.


2

Thật bất ngờ '='

Điều này có thể được gây ra bởi có các ký tự không hợp lệ trong một tên biến. Tên biến phải tuân theo các quy tắc sau:

Tên biến tuân theo các quy tắc giống như các nhãn khác trong PHP. Tên biến hợp lệ bắt đầu bằng một chữ cái hoặc dấu gạch dưới, theo sau là bất kỳ số lượng chữ cái, số hoặc dấu gạch dưới. Như một biểu thức chính quy, nó sẽ được biểu thị như vậy: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'


Ngoài ra John tốt.
Funk Bốn mươi Niner 19/12/18

1

Thật bất ngờ 'tiếp tục' (T_CONTINUE)

continuelà một câu lệnh (như cho, hoặc nếu) và phải xuất hiện độc lập. Nó không thể được sử dụng như là một phần của biểu thức. Một phần vì tiếp tục không trả về một giá trị, nhưng trong một biểu thức, mọi biểu thức phụ phải dẫn đến một số giá trị để biểu thức tổng thể dẫn đến một giá trị. Đó là sự khác biệt giữa một tuyên bố và một biểu thức.

Điều đó có nghĩa là continuekhông thể được sử dụng trong một câu lệnh ternary hoặc bất kỳ câu lệnh nào yêu cầu giá trị trả về.

Bất ngờ 'phá vỡ' (T_BREAK)

Cũng vậy với break;tất nhiên. Nó cũng không thể sử dụng được trong ngữ cảnh biểu thức, nhưng là một tuyên bố nghiêm ngặt (cùng cấp với foreachhoặc một ifkhối).

Bất ngờ 'trở về' (T_RETURN)

Bây giờ điều này có thể gây ngạc nhiên hơn cho return, nhưng đó cũng chỉ là một tuyên bố cấp khối . Nó trả về một giá trị (hoặc NULL) cho phạm vi / hàm cao hơn, nhưng nó không tự đánh giá là biểu thức. → Đó là: không có điểm nào trong việc làmreturn(return(false);;


1

Bất ngờ '.'

Điều này có thể xảy ra nếu bạn đang cố gắng sử dụng toán tử splat ( ...) trong phiên bản PHP không được hỗ trợ.

... lần đầu tiên có sẵn trong PHP 5.6 để nắm bắt số lượng đối số khác nhau cho hàm:

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

Trong PHP 7.4, bạn có thể sử dụng nó cho các biểu thức Array .

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

0

Thật bất ngờ 'cuối cùng' (T_ENDWHILE)

Cú pháp đang sử dụng dấu hai chấm - nếu không có dấu hai chấm, lỗi trên sẽ xảy ra.

<?php while($query->fetch()): ?>
 ....
<?php endwhile; ?>

Thay thế cho cú pháp này là sử dụng dấu ngoặc nhọn:

<?php while($query->fetch()) { ?>
  ....
<?php } ?>

http://php.net/manual/en/control-strucenses.fter.php


0

Một thông báo lỗi mà bắt đầu Parse error: syntax error, unexpected ':'có thể do nhầm lẫn viết một tài liệu tham khảo lớp tĩnh Class::$Variablenhư Class:$Variable.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.