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

Aug 05 2013

Mọi người đều gặp lỗi cú pháp. Ngay cả những lập trình viên có kinh nghiệm cũng mắc lỗi chính tả. Đối với người mới, đó chỉ là một phần của quá trình học hỏi. Tuy nhiên, thường dễ hiểu 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 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 cung cấp một ý tưởng sơ bộ về nơi bắt đầu tìm kiếm.

Luôn nhìn vào ngữ cảnh mã . Sai lầm cú pháp thường được giấu trong những đề cập hoặc trong dòng mã trước đó . So sánh mã của bạn với các ví dụ cú pháp từ sách hướng dẫn.

Trong khi không phải mọi trường hợp đều phù hợp với trường hợp khác. Tuy nhiên, có một số bước chung để giải quyết các 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:

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

Và:

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

  • Trả lời các lỗi viết mã và lỗi chính tả hẹp của mọi người được coi là chủ đề lạc đề.
  • Vì vậy, hãy dành thời gian để làm theo các bước cơ bản , trước khi đăng các yêu cầu sửa cú pháp.
  • Nếu bạn vẫn phải làm như vậy, vui lòng thể hiện sáng kiến ​​giải quyết của riêng bạn, các bản sửa lỗi đã cố gắng 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ư "SyntaxError: ký tự bất hợp pháp", thì đó thực sự không liên quan đến php , mà là lỗi cú pháp - javascript .


Lỗi cú pháp phát sinh 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 phải do 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, thì có thể do phiên bản PHP không tương thích, vì vậy hãy kiểm tra 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.

Trả lời

295 mario Aug 05 2013 at 10:11

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

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

Mẹo quan trọng nhất

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

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

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

  • Đọc tham chiếu ngôn ngữ và các ví dụ trong sách hướng dẫn. Hai lần, để trở nên thành thạo phần nào.

Cách giải thích lỗi phân tích cú pháp

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

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

Trong đó liệt kê vị trí có thể xảy ra lỗi cú pháp. Xem tên tệpsố dòng được đề cập .

Một biệt danh chẳng hạn như T_STRINGgiải thích ký hiệu mà cuối cùng trình phân tích cú pháp / tokenizer không thể xử lý. Tuy nhiê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à những 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 kết luận đã 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 cú pháp.

  • 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 và 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 tác dụng của mỗi ký hiệu.

  • Bạn cũng cần xem xét các dòng trước thường xuyên hơn .

    • Đặc biệt, thiếu ;dấu chấm phẩy ở dòng 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 vào nhau không chính xác, bạn có thể cần phải điều tra thêm về mã nguồn. Sử dụng thụt lề mã thích hợp để đơn giản hóa điều đó.

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

    • Tất cả các chuỗi và biến và hằng số phải có các màu khác nhau.

    • Các nhà khai thác +-*/.cũng nên được tô màu riêng biệt. Nếu không, chúng có thể ở trong bối cảnh sai.

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

    • Việc có hai ký tự dấu câu cùng màu bên cạnh nhau cũng có thể gây 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 / số nhận dạng trực tiếp theo sau nhau không chính xác trong hầu hết các ngữ 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 nào .

  • Tạm thời chia tay hàng dài.

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

    • Chia 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 dòng 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à đúng,
      2. Những phần bạn không chắc chắn,
      3. Và những dòng mà trình phân tích cú pháp phàn nàn.

      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 các 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 bình luận (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 ra nguồn gốc vấn đề. Nhìn kỹ hơn ở đó.

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

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

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

    • ? :Toán tử điều kiện bậc ba có thể thu gọ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 các ifcâu lệnh đơn giản trong khi không đảo ngược.

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

  • Những sai lầm phổ biến nhất dành cho người mới bắt đầu là:

    • Thiếu dấu chấm phẩy ;cho câu lệnh / dòng kết thúc.

    • Dấu ngoặc kép trong chuỗi không khớp cho "hoặc 'và dấu ngoặc kép không thoát trong.

    • Các toán tử bị quên, đặc biệt là đối với .nối chuỗi .

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

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

    • Nếu bạn giải quyết được một vấn đề nhưng các vấn đề khác lại xuất hiện trong một số đoạn mã bên dưới, thì hầu như bạn đang đi đúng hướng.

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

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

    • Áp dụng hệ thống lập phiên bản mã nguồn. Bạn luôn có thể xem diffphiên bản bị hỏng và phiên bản làm việc mới nhất. Điều này có thể làm sáng tỏ vấn đề cú pháp là gì.
  • Các ký tự Unicode bị lạc không nhìn thấy : Trong một số trường hợp, bạn cần sử dụng trình soạn thảo hoặc trình chỉnh sửa / trình xem khác nhau trên nguồn của bạn. Không thể tìm thấy một số vấn đề 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.

    • Đặc biệt là các BOM cụ thể, khoảng trắng có độ rộng bằng 0 hoặc khoảng trắng không ngắt và các dấu ngoặc kép thường xuyên có thể tìm thấy đường vào mã nguồn.

  • Hãy quan tâm đến loại dấu 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 phải \rtrả về xuống dòng.

    • Đâ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 trình chỉnh sửa được định cấu hình sai).

    • Nó thường chỉ xuất hiện như một vấn đề khi sử dụng dòng đơn //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 : Có thể là bạn đã gặp 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 còn trưng bày nó nữa. Điều này chỉ có thể 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 có chứa Unicode đi lạc vô hình (xem ở trên). Bạn có thể dễ dàng tìm ra: Chỉ cần sao chép lại mã của bạn từ biểu 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 cái được gọi thông qua máy chủ web.


    Chúng không nhất thiết phải giống nhau. Đặc biệt khi làm việc với các khuôn khổ, bạn sẽ phù hợp với chúng.

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

  • Thử-và-sai là phương sách 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 mình. Các ký hiệu cú pháp không dễ tìm kiếm ( Mặc dù vậy, bản thân Stack Overflow đã được SymbolHound lập chỉ mục ). Do đó, có thể phải xem qua một vài trang nữa trước khi bạn tìm thấy điều gì đó có liên quan.

Hướng dẫn thêm:

Màn hình trắng chết chóc

Nếu trang web của bạn chỉ trống, thì nguyên nhân thường là do lỗi cú pháp. Bật màn hình của họ với:

  • error_reporting = E_ALL
  • display_errors = 1

Nói php.inichung, hoặc thông qua .htaccesscho mod_php, hoặc thậm chí .user.inivới thiết lập FastCGI.

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 giải pháp nhanh chóng là tạo một tập lệnh trình bao bọc, giả sử 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 trì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.

116 Sliq Aug 13 2013 at 02:16

Tôi nghĩ rằng chủ đề này là hoàn toàn sai lệch / 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í có thể nói rằng làm việc mà không có IDE là một việc làm thiếu chuyên nghiệp. Tại sao? Bởi vì các IDE hiện đại sẽ kiểm tra cú pháp của bạn sau mỗi ký tự bạn nhập. Khi bạn viết 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ì bạn 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ẽ (một cách hiệu quả) 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 tính năng 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 Trình cắm PHP [miễn phí]
  4. Sublime [$ 80 USD] (chủ yếu là một trình soạn thảo văn bản, nhưng có thể mở rộng với các plugin, như PHP Syntax Parser )
58 mario Apr 08 2015 at 11:15

Bất ngờ [

Ngày nay, dấu [ngoặc nhọn mảng không mong muốn 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ũ hơn chỉ hỗ trợ array().

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

Tương tự như vậy, tính năng tham chiếu kết quả của hàm mảng cũng không khả dụng 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 là gì trong PHP? - "Lỗi cú pháp, không mong muốn \[" cho thấy các cách giải quyết phổ biến và thực tế nhất.

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

Xem thêm:

BTW, cũng có các bộ tiền xử lý và bộ chuyển đổi cú pháp PHP 5.4 nếu bạn thực sự quen 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 ra lỗi cú pháp không mong muốn[

Nếu đó không phải là phiên bản PHP không khớp, thì đôi khi đó là lỗi đánh máy đơn giản hoặc lỗi cú pháp dành cho người mới:

  • 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 , ngay cả trong PHP 7.

    protected $var["x"] = "Nope";
                  ⇑
    
  • Việc 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 lỗi thường gặp.

    foreach [$a as $b)
            ⇑
    

    Hoặc thậm chí:

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

    $var = const[123];
           ⇑
    

    Ít nhất PHP hiểu đó constlà một tên không đổi.

    Nếu bạn muốn truy cập một biến mảng (đó là nguyên nhân điển hình ở đây), thì hãy thêm $dấu hiệu đứ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ảng kết hợp. Đây không phải là cú pháp hợp lệ:

    global $var['key'];
    


Dấu ngoặc vuông ] đóng bất ngờ

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

  • Một lần nữa, sự 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 mà không có:

    $var = 2];
    

    Điều này thường xảy ra trong các 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 để so khớp dấu ngoặc để tìm bất kỳ lần ]đóng mảng sớm nào . Ít nhất hãy sử dụng thêm khoảng cách và dòng mới để thu hẹp nó.

47 mario Aug 07 2013 at 06:34

T_VARIABLE không mong đợi

"Không mong đợi 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.

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

    Nó thường chỉ ra một dấu chấm phẩy bị thiếu ở dòng trước. Các phép gán biến sau một câu lệnh là một chỉ báo tốt để xem xét:

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

    Một lỗi thường xuyên xảy ra là nối chuỗi với .toán tử bị quên :

                                    ⇓
     print "Here comes the value: "  $value;
    

    Btw, bạn nên thích nội suy chuỗi (các 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ày.

    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 xấu hổ khi 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 .nối biến nhanh hơn . Nó không thể.

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

    Tất nhiên, vấn đề tương tự có thể phát sinh trong các biểu thức khác, chẳng hạn 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 lẽ ra phải được thêm vào, trừ đi hay so sánh, v.v.

  4. Danh sách

    Tương tự đối với danh sách cú pháp, như trong quần thể mảng, trong đó trình phân tích cú pháp cũng chỉ ra dấu phẩy mong đợi, ,ví dụ:

                                           ⇓
     $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 globalcâu lệnh, hoặc khi thiếu ;dấu chấm phẩy trong forvòng lặp.

  5. Khai báo lớp

    Lỗi 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 các hằng số tĩnh chứ không phải các biểu thức. Do đó trình phân tích cú pháp phàn nàn về các biến là dữ liệu được chỉ định:

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

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

  6. Các biến sau số nhận dạng

    Bạn cũng có thể không bao giờ có một biến theo sau một số nhận dạng trực tiếp:

                  ⇓
     $this->myFunc$VAR();
    

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

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

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

    Nhập nhanh có thể dẫn đến việc quên mở hoặc đóng ngoặc đơn cho ifforvà các foreachcâu lệnh:

            ⇓
     foreach $array as $key) {
    

    Giải pháp: thêm phần mở đầu còn 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ã, không đóng ifbiểu thức với )dấu ngoặc đó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 khỏi elsehoặc sử dụng elseif.

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

         ⇓
    function() use $var {}
    

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

  10. Khoảng trắng ẩn

    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ư dấu cách không ngắt ), bạn cũng có thể gặp 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 tệp và cho mã sao chép và dán. Kiểm tra với một trình kiểm tra hexed, nếu mã của bạn trông không trực quan có chứa vấn đề cú pháp.

Xem thêm

32 mario Aug 07 2013 at 06:37

T_CONSTANT_ENCAPSED_STRING
Không mong đợi T_ENCAPSED_AND_WHITESPACE

Tên khó sử dụng T_CONSTANT_ENCAPSED_STRINGT_ENCAPSED_AND_WHITESPACEtham khảo trích dẫn literals ."string"

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

  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 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 các chuỗi được 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ề trích dẫn đơn chứa trong đó '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, nó hợp lệ khi sử dụng cú pháp đơn giản kiểu PHP2 trong dấu ngoặc kép cho các tham chiếu mảng:

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

    Tuy nhiên, các mảng lồng nhau hoặc các tham chiếu đối tượng sâu hơ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 từ nối

    Nếu một chuỗi theo sau một biểu thức, nhưng thiếu từ 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ù điều đó rõ ràng đối với bạn và tôi, nhưng PHP không thể đoán rằng chuỗi được gắn vào đó.

  3. Hộp trích dẫn chuỗi khó hiểu

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

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

    Ví dụ đó bắt đầu bằng dấu ngoặc kép. Nhưng dấu ngoặc kép cũng dành cho các thuộc tính HTML. Tuy nhiên, toán tử nối dự định bên trong được hiểu là một phần của chuỗi thứ hai trong dấu nháy đơ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 được trích dẫn đơn và kép. (Nó cũng giúp logic ứng dụng thích các chuỗi được trích dẫn kép cho đầu ra dạng văn bản và các chuỗi được trích dẫn đơn chỉ dành cho các giá trị giống như hằng số.)

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

    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, nhưng tất cả các IDE / trình chỉnh sửa tốt hơn lại giúp bằng cách tô màu các dấu ngoặc kép theo cách khác nhau.

  4. Thiếu trích dẫn mở đầu

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

                   ⇓
     make_url(login', 'open');
    

    Ở đây, ', 'sẽ trở thành một chuỗi theo nghĩa đen sau một từ trần, khi rõ ràng loginlà có 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 thêm dấu phẩy, nhưng việc bỏ qua một dấu phẩy ở giữa là điều không thể tha thứ. Rất khó để phát hiện ra nếu không có tô sáng cú pháp.

  6. Danh sách tham số hàm

    Điều tương tự đối với các cuộc gọi hàm :

                             ⇓
    myfunc(123, "text", "and"  "more")
    
  7. Chuỗi chạy trốn

    Một biến thể phổ biến là các dấu kết thúc 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 ký tự chuỗi trực tiếp theo sau nhau. Nhưng nguyên nhân thực sự là chuỗi trước đó chưa được tiết lộ tất nhiên.

Xem thêm

28 mario Aug 07 2013 at 06:36

T_STRING không mong đợi

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 số nhận dạng thô đã gặp phải. Điều này có thể bao gồm từ các baretừ đến các CONSTANTtên chức năng hoặc tên còn lại , các chuỗi không được trích dẫn bị quên hoặc bất kỳ văn bản thuần túy nào.

  1. Chuỗi trích dẫn 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 được trích dẫn sai. Bất kỳ câu nào không được thoát 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>";
    

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

    • Để thuận tiện, bạn nên thích các dấu ngoặc đơn bên ngoài khi xuất HTML thuần túy với dấu ngoặc kép bên trong.
    • Sử dụng các chuỗi được trích dẫn kép nếu bạn muốn nội suy các biến, nhưng sau đó đề phòng việc thoát "dấu ngoặc kép theo nghĩa đen .
    • Đối với đầu ra dài hơn, hãy thích nhiều echo/ printdòng thay vì thoát vào và ra. Tốt hơn hết hãy xem xé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 nhìn thấy toàn bộ giá trị biến PHP và tập trung vào đoạn mã mà quên mất nguồn của nó. Ví dụ ở đây

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

  2. Các chuỗi không được đóng chặt

    Nếu bạn bỏ lỡ một lần đóng" thì lỗi cú pháp thường xảy ra sau đó. Một chuỗi chưa kết thúc thường sẽ sử dụng 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");
             ⇯
    

    Nó 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à Unexpected '>'cho HTML theo nghĩa đen không được trích dẫn.

  3. Trích dẫn 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 nhận được mã không hợp lệ. Trích dẫn kiểu chữ không phải là những gì PHP mong đợi:

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

    Trích dẫn kiểu chữ / thông minh là các 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ỳ nghĩa đen văn bản nào sau đó sẽ được trình phân tích cú pháp coi là từ trần / T_STRING.

  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 chưa kết thúc 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 coi là định danh thô:

           ⇓
    func1()
    function2();
    

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

  5. Các thẻ và <?xmltiêu đề mở ngắn 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ẽ nhìn thấy <?và lấy lại nó cho chính nó. Nó sẽ không hiểu việc đi lạc xmlnhằm mục đích gì. Nó sẽ được hiểu là không đổi. Nhưng ý versionmuốn đượ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 được hai chữ / giá trị tiếp theo mà không có toán tử biểu thức ở giữa, đó sẽ là lỗi phân tích cú pháp.

  6. Các ký tự Unicode ẩn

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

    <?php
        print 123;
    

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

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

    <?php
        ;print 123;
    

    ;Dấu chấm phẩy bổ sung ở đây sẽ chuyển đổi ký tự ẩn trước đó thành một tham chiếu hằng số không xác định (biểu thức dưới dạng câu lệnh). Đổi lại, 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 một ký hiệu đô la theo sau là tên của biến.

    Dấu đô la ( $) là một dấu hiệu đánh dấu mã định danh là tên của một biến. Nếu không có dấu hiệu này, mã đị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 những trường hợp như vậy, một khai báo về kiểu biến (khi mã gốc được viết bằng ngôn ngữ sử dụng các biến đã nhập) cũng có thể bị lỗi 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à " Ký tự thoát " và thường yêu cầu trình phân tích cú pháp nhận 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 câu trích dẫn đóng của một chuỗi, thì câu trích dẫn đóng sẽ được hiểu theo nghĩa đen và không như ý muốn, tức là như một câu trích dẫn có thể in được như một phần của chuỗi và không đóng chuỗi. Điều này sẽ hiển thị dưới dạng lỗi phân tích cú pháp thường gặp 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 xác định đường dẫn trong Windows: "C:\xampp\htdocs\"sai. Bạn cần "C:\\xampp\\htdocs\\".

  9. Thuộc tính đã nhập

    Bạn cần PHP ≥7.4 để sử dụng cách nhập thuộc tính như:

    public stdClass $obj;
    
18 mario Aug 07 2013 at 06:39

Bất ngờ (

Mở ngoặc đơn thường tuân 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 không chính xác về mặt cú pháp sau "strings", trước đó (), đơn độc $và trong một số ngữ cảnh khai báo điển hình.

  1. Tham số khai báo hàm

    Một trường hợp hiếm hơn xảy ra đối với 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à các giá trị dạng chữ hoặc các biểu thức hằng. Không giống như đối với các lệnh gọi hàm, nơi bạn có thể tự do sử dụng whatever(1+something()*2), v.v.

  2. Thuộc tính lớp mặc định

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

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

    Đặt những thứ như vậy trong hàm tạo. 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 hằng ở đó.

  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 đó chưa kết thúc; và <script>các phần chữ rò rỉ vào ngữ cảnh mã PHP.

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

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

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

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

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


Bất ngờ )

  1. Tham số hàm vắng mặt

    Bạn không thể có dấu phẩy lạc cuối cùng trong một lệnh gọi hàm . 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 ở cuối chỉ được phép trong array()hoặc list()cấu trúc.

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

    Nếu bạn quên điều 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 )ngay cả, thì thay vào đó bạn sẽ nhận được khiếu nại về dấu chấm phẩy không mong muốn.

  3. Báo trước như constant

    Đối với các $tiền tố biến bị quên trong 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 ::. Bởi vì một lớp :: $ biến có thể đã thỏa mãn biểu thức $ biến mong đợi ..


Bất ngờ {

Dấu ngoặc nhọn {}bao bọc khối mã. Và lỗi cú pháp về chúng thường chỉ ra một số lồng ghép không chính xác.

  1. Các biểu thức phụ 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 bạn điều đó. Cũng không viết mã mà không có bất kỳ khoảng trắng nào. Số lượng khả năng đọ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 giữa dấu ngoặc đơn và dấu ngoặc nhọn, nó sẽ không tuân thủ ngữ pháp ngôn ngữ:

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

    Có một số ngoại lệ cho việc xây dựng mã đị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 được {}phân tích cú pháp 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 xảy ra bất ngờ cao hơn }trong những bối cảnh như vậy.


Bất ngờ }

Khi gặp }lỗi " không mong muốn ", hầu như bạn đã đó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 đối với bất kỳ biểu thức chưa kết thúc nào.

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

    function whatever() {
        doStuff()
    }            ⇧
    

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

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

    Đôi khi bạn sẽ thấy lỗi 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 mã trên, ifkhông có {dấu ngoặc nhọn mở . Do đó, phần đóng }bên dưới trở nên thừa. Và do đó, lần đóng tiếp theo }, được dành cho hàm, không thể liên kết với {dấu ngoặc nhọn mở ban đầu .

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


Không mong đợi {, mong đợi(

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 khai báo sai không có danh sách tham số không được phép:

                     ⇓
    function whatever {
    }
    
  2. Điều kiện câu lệnh kiểm soát

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

      ⇓
    if {
    }
    

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

    Nếu bạn gặp lỗi cụ thể này, bạn chắc chắn nên tra cứu một số ví dụ thủ công.

14 mario Apr 08 2015 at 03:26

$ End không mong đợi

Khi PHP nói về một "bất ngờ $end", điều đó có nghĩa là mã của bạn đã kết thúc sớm. (Thông báo này hơi gây hiểu lầm khi hiểu theo nghĩa đen. Nó không phải 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 "cuối 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.

luôn luôn về 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, hãy sử dụng thụt lề thích hợp để tránh những vấn đề như vậy.

  • Sử dụng một IDE với đối sánh dấu ngoặc để tìm ra chỗ nào }không ổn. 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]
    • Eclipse, Aptana: CtrlShiftP
    • Atom, Sublime: Ctrlm- Zend StudioCtrlM
    • Geany, Notepad ++: CtrlB- Joe: CtrlG- Emacs: C-M-n- Vim:%

Hầu hết các IDE cũng đánh dấu các dấu ngoặc nhọn, dấu ngoặc và dấu ngoặc đơn phù hợp. Điều này giúp bạn dễ dàng kiểm tra mối tương quan của chúng:

Biểu thức chưa kết thúc

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 chưa kết thúc:

  • $var = func(1, ?>EOF

Vì vậy, hãy xem phần cuối của script trước. Dấu cuối ;thường thừa đối với 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 vì nó thu hẹp các vấn đề cú pháp như vậy.

Điểm đánh dấu HEREDOC thụt lề

Một sự cố phổ biến khác xuất hiện với chuỗi HEREDOC hoặc NOWDOC . Điểm đánh dấu kết thúc bị bỏ qua với các dấu cách, 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 đó "$ end không mong muốn"). Khá nhiều IDE và trình chỉnh sửa tô sáng cú pháp sẽ làm rõ điều này 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 yêu cầu trình phân tích cú pháp nhận 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 câu trích dẫn đóng của một chuỗi, thì câu trích dẫn đóng sẽ được hiểu theo nghĩa đen và không như ý muốn, tức là như một câu trích dẫn có thể in được như một phần của chuỗi và không đóng chuỗi. Điều này sẽ hiển thị dưới dạng lỗi phân tích cú pháp thường gặp 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 xác định đường dẫn trong Windows: "C:\xampp\htdocs\"sai. Bạn cần "C:\\xampp\\htdocs\\".

Cú pháp thay thế

Hơi hiếm hơn, 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 mẫu. Sử dụng if:else:và một endif;ví dụ.

Xem thêm:

14 mario Dec 21 2016 at 04:43

T_IF
không mong đợi T_ELSEIF
không mong đợi T_ELSE T_ENDIF
không mong đợi

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à lồng ghép khối không hợp lệ → thiếu {dấu ngoặc nhọn }- hoặc quá nhiều.

  1. Thiếu {hoặc }do thụt lề sai

    Các dấu ngoặc nhọn 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 giống như thế này, hãy bắt đầu lại! Nếu không, nó không thể sửa được đối với bạn hoặc bất kỳ ai khác. Không có ích gì khi trưng bày điều này trên internet để yêu cầu trợ giúp.

    Bạn sẽ chỉ có thể sửa chữa nó, nếu bạn có thể theo dõi trực quan cấu trúc và mối quan hệ lồng nhau của các điều kiện if / else và các {khối mã của chúng }. Sử dụng IDE của bạn để xem liệu 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 đó, hãy 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 if / else lồng nhau.

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

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

    Một sai lầm đáng ngạc nhiên thường gặp đối với người mới 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ư câu lệnh print:

                       ⇓
    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 điều kiện bậc ba , nhưng hãy cẩn thận với các tác động về khả năng đọc.

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

    Nếu không, hãy phá vỡ cấu trúc đầu ra như vậy: sử dụng nhiều ifs và echos .
    Tốt hơn, 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>";
    

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

    Các 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 số lập trình viên thậm chí cố gắng xử lý ifnhư thể nó có thể trả về kết quả :

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

    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.

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

    Bạn sẽ phải sử dụng một nhiệm vụ trong khối mã :

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

    Ngoài ra, sử dụng ?:so sánh bậc ba.

    Nếu trong Nếu

    Bạn cũng không thể lồng mộtif 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, vì and(hoặc or) đã cho phép so sánh chuỗi.

  3. Đã quên ;dấu chấm phẩy

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

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

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

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

    Bây giờ có lẽ sai 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 này xảy ra thường xuyên hơn bạn có thể tưởng tượng.

    • Khi bạn kết thúc if ()biểu thức với; nó sẽ thực thi một câu lệnh void. Cái ;trở thành một cái trống {}của chính 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 một 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 muốn.

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

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

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

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

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

    Tuy nhiên, điều đó có nhiều khả năng làm sai cú pháp. Các câu lệnh bổ sung sớm hay muộn sẽ được đưa vào các nhánh if / else:

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

    Nhưng để thực sự sử dụng các khối mã, bạn phải viết {}chúng như vậy!

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

  6. Else / Elseif sai thứ tự

    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ó bao nhiêu elseiftùy thích, 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âu lệnh điều khiển trong khai báo lớp:

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

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

  8. T_ELSEIF / T_ELSE không mong đợi

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

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

    Mẫu đúng <?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 {
    }
    

    Một trong hai 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.

    • Dù sao điều này cũng không có ý nghĩa. Không phải là 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 xem các câu lệnh in thuộc về / hoặc nếu chúng cần được lặp lại trong cả hai nhánh.

    Bạn cũng không thể phân chia if / else 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 nào 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 bị phàn nàn về T_ENDIF không mong muốn, bạn đang sử dụng kiểu cú pháp thay thế if:elseif:else:endif;. Điều mà bạn thực sự nên suy nghĩ lại.

    • Một lỗi phổ biến là nhầm lẫn giữa dấu hai chấm tương tự:; kỳ lạ với dấu chấm phẩy . (Được bao gồm trong "Dấu chấm phẩy quá sớm")

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

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

    Trong khi "$ end không mong đợi" thường là giá cho một }dấu ngoặc nhọn đóng bị quên .

  10. Phép 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 ngữ cảnh này:

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

    Đó không phải là ==/ ===so sánh, mà là một =phép gán . Đ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ộ khối điều kiện. Trước tiên, hãy để ý những nhiệm vụ không mong muốn - bất cứ khi nào bạn gặp lỗi logic / xử lý sai.

11 mario May 09 2015 at 22:59

T_IS_EQUAL
Không mong đợi T_IS_GREATER_OR_EQUAL
Không mong đợi T_IS_IDENTICAL
Không mong đợi T_IS_NOT_EQUAL
Không mong đợi T_IS_NOT_IDENTICAL
Không mong đợi T_IS_SMALLER_OR_EQUAL
Không <
mong đợi Không mong đợi>

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à phân tích cú pháp không chính xác 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 phép so sánh, bạn phải cẩn thận đếm chính xác dấu ngoặc đơn mở và đóng :

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

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

    Một khi các phép so sánh của bạn trở nên đủ phức tạp, thay vào đó, việc chia nó thành nhiều ifcấu trúc lồng nhau và có ích .

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

    Một người mới thường gặp 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 đối với PHP, bởi vì issetemptylà các cấu trúc ngôn ngữ chỉ chấp nhận các tên biến. So sánh kết quả cũng không có ý nghĩa gì, vì đầu ra chỉ là / đã là boolean.

  3. Gây 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 chúng đôi khi 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 nó đúng.

    Xem thêm: Cấu trúc câu lệnh if 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 ra rằng bạn muốn so sánh lại biến ban đầu. Các biểu thức thường được ghép nối theo mức độ ưu tiên của toán tử , vì vậy vào thời điểm <được nhìn thấy, sẽ chỉ còn lại một kết quả boolean từ biến ban đầu.

    Xem thêm: T_IS_SMALLER_OR_EQUAL không mong đợi

  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 chống lại $x.

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

  6. Không >
    mong đợi<

    Các toán tử lớn hơn >hoặc nhỏ hơn <không có T_XXXtên tokenizer tùy chỉnh . Và trong khi chúng có thể được đặt sai vị trí như tất cả những thứ 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 được trích dẫn sai và HTML bị trộn:

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

    Điều này tương đương với 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 nhận nó. Nguyên nhân thực sự và lỗi cú pháp là do "kết thúc 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 mario Aug 07 2013 at 06:40

T_IF
không mong đợi T_FOREACH
Không mong đợi T_FOR
Không mong đợi T_WHILE
Không mong đợi T_DO
Không mong đợi 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 của chính họ.

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

    Khá phổ biến là bạn đã bỏ lỡ 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ề một 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 mà đ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 phần khởi tạo thuộc tính và phần phương thức. Không có mã nào có thể cư trú ở đó.

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

    Các lỗi cú pháp như vậy thường xảy ra đối với {và được lồng nhau không chính xác }. Đặc biệt là khi các khối mã chức năng bị đóng quá sớm.

  3. Các câu lệnh 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 làm 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 iftrong chuỗi, biểu thức toán học hoặc ở những nơi khác:

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

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

    Đ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()là một ngôn ngữ được tích hợp sẵn có thể được sử dụng trong ngữ cảnh diễn đạt. (Nhưng hiếm khi có ý nghĩa.)

  4. Từ khóa dành riêng làm số nhận dạng

    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 xác định. (Có lẽ trong PHP 7. Nhưng ngay cả khi đó cũng không được khuyến khích.)

  5. Của bạn có dấu chấm phẩy thay vì dấu hai chấm (:) hoặc dấu ngoặc nhọn ({) sau khối điều khiển của bạn

    Cấu trúc điều khiển thường được bao bọc trong dấu ngoặc nhọn (nhưng dấu hai chấm có thể được sử dụng trong một cú pháp thay thế ) để thể hiện phạm vi của chúng. Nếu bạn vô tình sử dụng dấu chấm phẩy, bạn sẽ đóng khối đó quá sớm dẫn đến câu lệnh đóng của bạn gặp lỗi.

    foreach ($errors as $error); <-- should be : or {
7 JohnConde Feb 08 2018 at 00:53

Bất ngờ '?'

Nếu bạn đang cố gắng sử dụng toán tử liên kế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

Không mong đợi '?', 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 {

Điều này một lần nữa cho biết 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();).

6 mario Nov 09 2017 at 19:38

T_LNUMBER không mong đợi

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) )
      

      Nơi mà cuộc gọi lại lẽ ra phải được trích dẫn. (Bây giờ /ecờ regex không được dùng nữa. Nhưng đôi khi nó vẫn bị sử dụng sai trong các preg_replace_callbackhàm.)

    • 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
      
    • Trong khi tokenizer / parser không cho phép một $1tên biến theo nghĩa đen , người ta có thể sử dụng ${1}hoặc ${"1"}. Đó là một giải pháp cú pháp cho các số nhận dạng không chuẩn. (Tốt nhất hãy 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 hơn cho những 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 các mã nhận dạng Unicode; như vậy $➊sẽ hợp lệ. (Không giống như một nghĩa đen 1).

  2. Mục nhập mảng Stray

    Khoảng thời gian dài không mong muốn 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 lệnh gọi và khai báo hàm cũng như 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 trong số ;hoặc ,bị thiếu để 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 được trích dẫn sai là một nguồn thường xuyên của các số lạc:

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

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

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

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

             ↓
    function 123shop() {
    

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

2 JohnConde Oct 29 2018 at 09:22

Không mong đợi '='

Điều này có thể do có các ký tự không hợp lệ trong 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 tương tự 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ố chữ cái, số hoặc dấu gạch dưới nào. Là 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] *'

1 mario Aug 10 2018 at 19:45

'Tiếp tục' không mong đợi (T_CONTINUE)

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

Phương tiện đó continuekhông thể được sử dụng trong câu lệnh bậc ba hoặc bất kỳ câu lệnh nào yêu cầu giá trị trả về.

'Sự cố' không mong muốn (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, mà là một câu lệnh nghiêm ngặt (cùng cấp với foreachhoặc một ifkhối).

'Trở lại' không mong đợi (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 / chức năng cao hơn, nhưng nó không tự đánh giá là biểu thức. → Đó là: không có ích gì khi làmreturn(return(false);;

1 JohnConde Apr 24 2020 at 18:47

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 một 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 một số lượng biến đối số cho một 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 Mảng .

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
mplungjan Jan 31 2019 at 21:57

Không mong đợi 'cuối cùng' (T_ENDWHILE)

Cú pháp sử dụng dấu hai chấm - nếu không có dấu hai chấm thì 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-structures.ared.php

DavidSpector Jul 20 2019 at 19:36

Thông báo lỗi bắt đầu Parse error: syntax error, unexpected ':'có thể do viết nhầm một tham chiếu tĩnh lớp Class::$VariableClass:$Variable.