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 đã từng bị tắt theo mặc định hiện đượ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ừ 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 tệp 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ừ Windows Stack của Bitnami, tôi sẽ thấy một cái gì đó 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
; //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 có phần khó hiểu và không được ghi nhận bên ngoài php.ini, vì vậy tôi đã không xác nhận điều này trên các phân phối khác.not validated this on other distributions.
Tuy nhiên, để trả lời câu hỏi của bạn, lỗi này xuất hiện ngay bây giờ khi nó không bật lên trước đây vì:
Bạn đã cài đặt PHP và cài đặt mặc định mới có phần nào được ghi lại kém nhưng không loại trừ
E_NOTICE
.E_NOTICE
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 giữE_NOTICE
đã buộc tôi phải khai báo các biến của tôi. Nó làm cho nó dễ dàng hơn rất nhiều để học C. Trong C, không tuyên bố các biến lớn hơn nhiều so với 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"
1 và thay thế nó bằng những gì hiện chưa được đưa ra sau khi ký bằng trongfunction foo[] { $my_variable_name = ''; //.... if [$my_variable_name] { // perform some logic } }
2. 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 tệp Php.ini "RIGHT". Chính xác 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 thức được đề xuất, nhưng nếu bạn có mã di sản sẽ cực kỳ khó chỉnh sửa, sau đó nó có thể là đặt cược tốt nhất của bạn.function foo[] { $my_variable_name = ''; //.... if [$my_variable_name] { // perform some logic } }
Tắt
E_NOTICE
trên cấp độ tệp hoặc thư mục. Điều này có thể thích hợp hơn nếu bạn có một số mã di sản nhưng muốn làm mọi thứ theo cách "đúng". Để làm điều này, bạn nên tham khảo Apache & NBSP; 2, Nginx hoặc bất cứ máy chủ nào bạn chọn. Trong Apache, bạn sẽ sử dụng
4 bên trongfunction foo[] { $my_variable_name = ''; //.... if [$my_variable_name] { // perform some logic } }
5.function foo[] { $my_variable_name = ''; //.... if [$my_variable_name] { // perform some logic } }
Viết lại mã của bạn để được 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 đó nhìn thấy lỗi của bạn, hãy đảm bảo rằng bạn đang vô hiệu hóa bất kỳ màn hình nào và chỉ đăng nhập lỗi của bạn [xem
6 vàfunction foo[] { $my_variable_name = ''; //.... if [$my_variable_name] { // perform some logic } }
7 trong Php.ini và máy chủ của bạn cài đặt].logging your errors [seefunction foo[] { $my_variable_name = ''; //.... if [$my_variable_name] { // perform some logic } }
6 andfunction foo[] { $my_variable_name = ''; //.... if [$my_variable_name] { // perform some logic } }
7 in php.ini and your server settings].function foo[] { $my_variable_name = ''; //.... if [$my_variable_name] { // perform some logic } }
Để mở rộng trên tùy chọn 3: Đây là lý tưởng. Nếu bạn có thể đi theo con đường này, bạn nên. Nếu bạn không đi theo tuyến đường này ban đầu, 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ỏ
function foo[]
{
$my_variable_name = '';
//....
if [$my_variable_name] {
// perform some logic
}
}
8 và function foo[]
{
$my_variable_name = '';
//....
if [$my_variable_name] {
// perform some logic
}
}
9 để xem những gì có thể xảy ra 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.Các lỗi có nghĩa là gì?
// 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;
0 - Đ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, nó bên trong chỉ giả định giá trị null. Tuy nhiên, bạn cần kiểm tra một biến trong kịch bản nào trước khi đượ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ở trong đó các biến được xác định là cao trong phạm vi của chúng như chúng có thể được xác định. Nó giúp cho việc biết các biến nào sẽ xuất hiện trong tương lai dễ dàng hơn và giúp đọc/tìm hiểu mã dễ dàng hơn.function foo[]
{
$my_variable_name = '';
//....
if [$my_variable_name] {
// perform some logic
}
}
// 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;
1 - Đ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 ngừa lỗi này, hã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 chức năng 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 những 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. Ngày nay, tôi nhiều hơn một người ____22 :].