2012-11-06 48 views
11

Tất cả trên web [1][2][3], nó nói rằng kể từ PHP 5.0.0 "gán giá trị trả về mới bằng cách tham khảo" cho một E_DEPRECATED hoặc E_STRICT tùy thuộc vào phiên bản php của bạn (E_DEPRECATED không tồn tại cho đến 5.3, do đó, nó là E_STRICT trước đó).mới bằng cách tham khảo không đưa ra cảnh báo

Như vậy nó là sự hiểu biết của tôi rằng mã này nên đưa ra một cảnh báo như vậy:

error_reporting(E_ALL | E_STRICT); 

class A 
{ 
} 

$a =& new A(); 

Tuy nhiên, tôi đã cố gắng này trên hai máy chủ hoàn toàn khác nhau (một chạy PHP 5.3 và một chạy PHP 5.2) và không thực sự đang đưa ra bất kỳ thông điệp nào! Chuyện gì vậy? Sự hiểu biết của tôi không chính xác hoặc là điều gì đó kỳ lạ xảy ra trên hai máy chủ đó?

(Tôi cũng không nghĩ rằng đó là lạ mà này bị phản đối, thấy rằng $a = null; $b =& $a; $b = new A(); không làm tương tự như $a = null; $b =& $a; $b =& new A();, nhưng đó chỉ là một phần của câu hỏi nếu tôi hiểu sai những gì đang bị phản đối ...)

+0

Kỳ lạ thay, tôi chỉ gặp lỗi này nếu tôi chạy lệnh này trên 'phpsh',' PHP không được chấp nhận: Gán giá trị trả về mới bằng tham chiếu không được chấp nhận trong /Library/Python/2.7/site-packages/phpsh/phpsh.php (578): eval() 'd mã trên dòng 1', nhưng không phải nếu tôi chạy nó trực tiếp từ cli. – Dogbert

+0

@ Dogbert: Điều đó thật kỳ lạ. Tôi đã chỉ thử nó như là phục vụ từ các máy chủ Apache bên ngoài bản thân mình, nhưng khi tôi có thời gian tôi sẽ xem xét chạy nó từ dòng lệnh và 'phpsh' bản thân mình – Jasper

+1

Nó sẽ không gây ngạc nhiên cho tôi nếu vấn đề ở đây nằm ở nơi khác: thử đặt 'E_ALL | E_STRICT' trong php.ini của bạn trực tiếp, đừng quên thay đổi php-cli.ini, nếu bạn đang chạy mã này trên dòng lệnh. Ngoài ra, hãy kiểm tra kỹ xem các lỗi này có bị ẩn hay không bằng cách thực hiện 'ini_set ('display_errors', 1);'. Ngoài ra, nếu bạn đang chạy này trên một cửa sổ hộp, đã có [một số lỗi] (https://bugs.php.net/bug.php?id = 46326) với điều này trong quá khứ –

Trả lời

2

Để phản hồi cho OP, nhận xét này đã chỉ cho anh ta đúng hướng:

Tôi sẽ không ngạc nhiên nếu vấn đề ở đây nằm ở nơi khác: thử đặt E_ALL | E_STRICT trong php.ini của bạn trực tiếp, đừng quên thay đổi php-cli.ini, nếu bạn đang chạy mã này trên dòng lệnh.
Ngoài ra hãy kiểm tra kỹ xem lỗi có bị ẩn hay không bằng cách thực hiện ini_set('display_errors',1);1. Nếu bạn đang chạy điều này trên một cửa sổ hộp, đã có some bugs với điều này trong quá khứ.

Vì OP cũng chỉ ra rằng các cảnh báo được tạo trước khi bất kỳ mã nào được thực thi, tôi có linh cảm, cảnh báo dự kiến ​​sẽ được tăng lên trong thời gian biên dịch, thay vì thời gian chạy, vì vậy tôi có một cái nhìn khác tại the docs. Ở đó, tôi thấy lớn nốt đỏ-ô này, trong đó khẳng định nghi ngờ của tôi:

Hầu hết các lỗi E_STRICT được đánh giá tại thời gian biên dịch lỗi như vậy, như vậy không được báo cáo trong các tập tin mà error_reporting được tăng cường để bao gồm các lỗi E_STRICT (và ngược lại).

Kể từ phiên bản 5 PHP là một cách hiệu quả một "biên soạn" ngôn ngữ (tương tự như Java, mã được biên dịch để Zend bytecode). Khi công cụ Zend biên dịch mã có lỗi được phát hành vào thời gian được biên dịch, cuộc gọi error_reporting trong kịch bản lệnh không ảnh hưởng đến thời tiết hoặc không có các lỗi này được báo cáo: cuộc gọi error_reporting chỉ áp dụng cho các lỗi/cảnh báo thời gian chạy.
Có lẽ điều này: error_reporting(E_ALL | E_STRICT | E_COMPILE_ERROR); đáng xem, quá

Dòng dưới cùng:
Đặt báo cáo lỗi trong tệp php.ini bất cứ khi nào bạn có thể.

+0

Trong thực tế, điểm mà các lỗi được thực hiện trước khi bất kỳ mã nào được thực hiện (đó là một cách khác để nói thời gian biên dịch) là một kết luận mà tôi đã vẽ từ thực tế là thiết lập 'error_reporting' từ tập lệnh không hoạt động và thiết lập nó bên ngoài đã làm việc. Tất nhiên, mã cũng cho thấy nó, nhưng tại thời điểm đó tôi đã mong đợi các lỗi ở đầu nếu hiển thị ở tất cả. – Jasper

+0

@ Jasper, tôi cho rằng bạn biết về biên dịch - so với thời gian chạy, nhưng đó không phải là tất cả mọi người nhận thức được, đó là lý do tại sao tôi bao gồm sự khác biệt trong câu trả lời của tôi, vì vậy điều này chủ yếu là để thông báo cho người khác. Vấn đề của bạn, như bạn đã biết quá rõ bây giờ, chỉ cần xuống tệp .ini giao dịch với các thiết lập nếu công cụ Zend từ đầu đến cuối, 'error_reporting' chỉ ghi đè các cài đặt đó khi mã đã được biên dịch và sẵn sàng chạy. Tôi chỉ nghĩ rằng không phải ai cũng đã thấy rằng đủ để trả lời ;-P ... dù sao, câu hỏi hay: Tôi cũng đã tìm ra một vài điều mới trên đường đi, quá –

+1

Thật tuyệt khi bạn đưa nó vào câu trả lời của bạn và đó là tôi thực sự đang nói về điều đó. Những gì tôi đã nói về là sự pha trộn của 'kể từ khi OP cũng chỉ ra [..] '. Ừ, thỉnh thoảng tôi có thể cầu kỳ. Nhưng đừng bận tâm, nó đủ gần với sự thật: D – Jasper

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