TẠI SAO CHUYỆN NÀY ĐANG XẢY RA?
Theo thời gian, PHP đã trở thành một ngôn ngữ tập trung vào bảo mật hơn. Các cài đặt được sử dụng để tắt theo mặc định giờ được bật theo mặc định. Một ví dụ hoàn hảo về điều này là E_STRICT
, được bật theo mặc định kể từ phiên bản PHP 5.4.0 .
Hơn nữa, theo tài liệu PHP, theo mặc định, E_NOTICE
bị vô hiệu hóa trong php.ini. Tài liệu PHP khuyên bạn nên bật nó cho mục đích gỡ lỗi . Tuy nhiên, khi tôi tải xuống PHP từ kho lưu trữ Ubuntu và từ stack stack Windows của BitNami, tôi thấy một thứ khác.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Lưu ý rằng error_reporting
thực sự được đặt thành giá trị sản xuất theo mặc định, không phải là giá trị "mặc định" theo mặc định. Điều này hơi khó hiểu và không được ghi lại bên ngoài php.ini, vì vậy tôi chưa xác thực điều này trên các bản phân phối khác.
Tuy nhiên, để trả lời câu hỏi của bạn, lỗi này bật lên khi nó không bật lên trước vì:
Bạn đã cài đặt PHP và các cài đặt mặc định mới có phần tài liệu kém nhưng không loại trừ E_NOTICE
.
E_NOTICE
các cảnh báo như các biến không xác định và các chỉ mục không xác định thực sự giúp làm cho mã của bạn sạch hơn và an toàn hơn. Tôi có thể nói với bạn rằng, nhiều năm trước, việc E_NOTICE
kích hoạt đã buộc tôi phải khai báo các biến của mình. Nó làm cho việc học C trở nên dễ dàng hơn rất nhiều, việc không khai báo các biến lớn hơn nhiều phiền toái.
TÔI CÓ THỂ LÀM GÌ VỚI NÓ?
Tắt E_NOTICE
bằng cách sao chép "Giá trị mặc định" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
và thay thế nó bằng giá trị hiện không bị thiếu sau khi đăng nhập bằng error_reporting =
. Khởi động lại Apache hoặc PHP nếu sử dụng CGI hoặc FPM. Hãy chắc chắn rằng bạn đang chỉnh sửa php.ini "đúng". Cái đúng sẽ là Apache nếu bạn đang chạy PHP với Apache, fpm hoặc php-fpm nếu chạy PHP-FPM, cgi nếu chạy PHP-CGI, v.v. Đây không phải là phương pháp được đề xuất, nhưng nếu bạn có mã kế thừa thì sẽ cực kỳ khó chỉnh sửa, đó có thể là lựa chọn tốt nhất của bạn.
Tắt E_NOTICE
cấp độ tập tin hoặc thư mục. Điều này có thể tốt hơn nếu bạn có một số mã kế thừa nhưng muốn làm mọi thứ theo cách "đúng" theo cách khác. Để làm điều này, bạn nên tham khảo Apache2, Nginx hoặc bất cứ máy chủ nào bạn chọn. Trong Apache, bạn sẽ sử dụng php_value
bên trong <Directory>
.
Viết lại mã của bạn để sạch hơn. Nếu bạn cần làm điều này trong khi chuyển sang môi trường sản xuất hoặc không muốn ai đó thấy lỗi của mình, hãy đảm bảo rằng bạn đang vô hiệu hóa bất kỳ lỗi hiển thị nào và chỉ ghi nhật ký lỗi của bạn (xem display_errors
và log_errors
trong php.ini và cài đặt máy chủ của bạn) .
Để mở rộng trên tùy chọn 3: Đây là lý tưởng. Nếu bạn có thể đi tuyến đường này, bạn nên. Nếu ban đầu bạn không đi tuyến đường này, hãy xem xét việc di chuyển tuyến đường này cuối cùng bằng cách kiểm tra mã của bạn trong môi trường phát triển. Trong khi bạn đang ở đó, hãy loại bỏ ~E_STRICT
và ~E_DEPRECATED
để xem những gì có thể đi sai trong tương lai. Bạn sẽ thấy RẤT NHIỀU lỗi lạ, nhưng nó sẽ ngăn bạn gặp bất kỳ vấn đề khó chịu nào khi bạn cần nâng cấp PHP trong tương lai.
Ý NGH MEA LÀ GÌ?
Undefined variable: my_variable_name
- Điều này xảy ra khi một biến chưa được xác định trước khi sử dụng. Khi tập lệnh PHP được thực thi, bên trong nó chỉ thừa nhận một giá trị null. Tuy nhiên, trong kịch bản nào bạn sẽ cần kiểm tra một biến trước khi nó được xác định? Cuối cùng, đây là một đối số cho "mã cẩu thả". Là một nhà phát triển, tôi có thể nói với bạn rằng tôi yêu nó khi tôi thấy một dự án nguồn mở nơi các biến được định nghĩa là cao trong phạm vi của chúng khi chúng có thể được xác định. Nó giúp dễ dàng hơn để nói những biến nào sẽ xuất hiện trong tương lai và làm cho việc đọc / tìm hiểu mã dễ dàng hơn.
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- Điều này xảy ra khi bạn cố gắng truy cập một giá trị trong một mảng và nó không tồn tại. Để ngăn chặn lỗi này, thực hiện kiểm tra có điều kiện.
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
Một tùy chọn khác là khai báo một mảng trống ở đầu hàm của bạn. Không phải lúc nào cũng khả thi.
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(mẹo bổ sung)
- Khi tôi gặp phải những vấn đề này và các vấn đề khác, tôi đã sử dụng NetBeans IDE (miễn phí) và nó đã cho tôi một loạt các cảnh báo và thông báo. Một số trong số họ cung cấp lời khuyên rất hữu ích. Đây không phải là một yêu cầu và tôi không sử dụng IDE nữa ngoại trừ các dự án lớn. Tôi là một
vim
người nhiều hơn những ngày này :).