2013-03-22 40 views
5

Dưới đây là hai phiên bản của một dòng trong một file php:Tại sao dán một dòng ngắt mã nếu viết cùng một dòng bằng tay hoạt động tốt?

Đầu tiên phiên bản:

if ($projet['sourceDonnees'] === (string)$CONSTANTS['sourceDonnees_saisie']) { 

Thứ hai phiên bản:

if ($projet['sourceDonnees'] === (string)$CONSTANTS['sourceDonnees_saisie']) { 

Mặc dù họ trông giống hệt nhau, phiên bản đầu tiên kết quả trong một PHP Parse error: syntax error, unexpected T_STRING, trong khi phiên bản thứ hai hoạt động tốt. Sự khác biệt giữa hai là phiên bản đầu tiên được dán và sửa đổi trong khi phiên bản thứ hai được viết ra bằng tay hoàn toàn. Những gì đang xảy ra ở đây?

Ghi chú: Dòng được sao chép từ tệp văn bản được mã hóa bằng UTF-8 và được dán vào tệp văn bản UTF-8 khác. Tất cả các hoạt động được thực hiện trong gedit, cả hai tập tin được viết bởi tôi trong gedit.

+4

Nếu trình chỉnh sửa của bạn có tùy chọn hiển thị biểu tượng, hãy thử bật biểu tượng đó và xem tit có giúp giảm bớt ánh sáng hay không. – Jrod

+1

Tôi sử dụng BBEdit cho phép tôi bật tùy chọn để xem các ký tự ẩn. Thông thường mã mà tôi tìm thấy trực tuyến và được sao chép từ một trình duyệt hoàn toàn bị hỏng với rác vô hình.Tốt nhất là nhập lại mã bạn tìm thấy trực tuyến nếu trình chỉnh sửa của bạn không đủ nâng cao để hiển thị cho bạn các ký tự đi lạc. Trong mã của bạn, BBEdit đang hiển thị cho tôi một ký tự vô hình nằm giữa ']' và '===', như thế này '] • ==='. Nhập lại nó bằng một khoảng trắng. – Sparky

+0

@Sparky Làm thế nào để người ta thường gõ ký tự đó? Có lẽ tôi đã gõ nó một cách tình cờ trong chuỗi gốc ... – Shawn

Trả lời

3

Khi tôi sao chép & dán dòng đầu tiên của bạn vào trình soạn thảo văn bản của tôi và bật "nhân vật vô hình hiển thị" tùy chọn, nó trông như thế này:

enter image description here

if ($projet['sourceDonnees']•=== (string)$CONSTANTS['sourceDonnees_saisie']) { 

Thông báo các giữa số ]===.

Dòng mã thứ hai của bạn hiển thị hoàn toàn sạch sẽ.

Nhiều lần bạn sẽ nhận các ký tự ẩn vô hình khi bạn sao chép & dán văn bản từ trang web. Tuy nhiên, tôi không biết kết hợp bàn phím nào sẽ tái tạo điều này từ đầu.

Tiếp tục thử nghiệm cho thấy nhân vật vô hình này là "phi ASCII" ... soạn thảo văn bản BBEdit chỉ đơn giản gọi họ là "Gremlins", và thậm chí có một "Gremlins zap" chức năng.

5

Bạn đã sao chép các dấu trích dẫn UTF-8, không thể phân tích cú pháp bằng PHP. Xóa dấu ngoặc kép và thay thế chúng bằng các mã ASCII tương đương (tức là bằng cách nhập chúng).

Để biết thêm thông tin về ASCII vs UTF-8 dấu ngoặc kép thấy http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html

+0

Thật sao? Cả hai dòng được viết bởi tôi bằng cách sử dụng cùng một dấu ngoặc kép trong cùng một trình soạn thảo văn bản ... – Shawn

+0

Tôi không thể cho bạn biết nó sẽ xảy ra với tệp của bạn như thế nào, nhưng tôi có thể đảm bảo rằng các dấu trích dẫn đã được chuyển đổi thành tương đương unicode của họ (đã xảy ra với tôi một vài lần trước đây, thường là sao chép từ các blog). Bạn có thể sử dụng 'xxd' để kiểm tra mã hex nếu bạn thực sự muốn thâm nhập vào nó ... –

0

unexpected T_STRING thường là một vấn đề với dấu ngoặc kép hoặc đánh dấu vết. ' s trong mã mà bạn đã sao chép là UTF-8 và có thể là một phiên bản của câu trích dẫn mà PHP không thể phân tích cú pháp, giống như các cú pháp mà chúng tôi sử dụng cho mã nội tuyến ở đây trên SO. Hãy thử thay đổi chúng thành một trích dẫn thông thường và nó có thể sẽ giải quyết vấn đề của bạn.

Nếu không phải như vậy, hãy đảm bảo bạn không bỏ lỡ dấu chấm phẩy ở cuối chức năng của bạn. Điều này có thể gây ra lỗi tương tự.