Hướng dẫn why does php show undefined variables? - tại sao php hiển thị các biến không xác định?

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
; 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 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ì:

  1. 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.

  2. 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ó?

  1. Tắt E_NOTICE bằng cách sao chép "giá trị mặc định"

    function foo()
    {
        $my_variable_name = '';
    
        //....
    
        if ($my_variable_name) {
            // perform some logic
        }
    }
    
    1 và thay thế nó bằng những gì hiện chưa được đưa ra sau khi ký bằng trong
    function 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.

  2. 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

    function foo()
    {
        $my_variable_name = '';
    
        //....
    
        if ($my_variable_name) {
            // perform some logic
        }
    }
    
    4 bên trong
    function foo()
    {
        $my_variable_name = '';
    
        //....
    
        if ($my_variable_name) {
            // perform some logic
        }
    }
    
    5.

  3. 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

    function foo()
    {
        $my_variable_name = '';
    
        //....
    
        if ($my_variable_name) {
            // perform some logic
        }
    }
    
    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 (see
    function foo()
    {
        $my_variable_name = '';
    
        //....
    
        if ($my_variable_name) {
            // perform some logic
        }
    }
    
    6 and
    function foo()
    {
        $my_variable_name = '';
    
        //....
    
        if ($my_variable_name) {
            // perform some logic
        }
    }
    
    7 in php.ini and your server settings).

Để 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 :).

Tại sao tôi nhận được các biến không xác định PHP?

Biến không xác định: Không tìm thấy định nghĩa của biến trong các tệp dự án, được cấu hình bao gồm các đường dẫn hoặc trong số các biến được xác định trước PHP. Biến có thể chưa được xác định: có một hoặc nhiều đường dẫn để tiếp cận dòng với việc sử dụng biến mà không cần xác định nó.the variable's definition is not found in the project files, configured include paths, or among the PHP predefined variables. Variable might have not been defined: there are one or more paths to reach the line with the variable usage without defining it.

Điều gì làm cho một biến không xác định?

Một biến chưa được gán một giá trị là loại không xác định.Một phương thức hoặc câu lệnh cũng trả về không xác định nếu biến đang được đánh giá không có giá trị được gán.Một hàm trả về không xác định nếu một giá trị không được trả về. is of type undefined . A method or statement also returns undefined if the variable that is being evaluated does not have an assigned value. A function returns undefined if a value was not returned .

Làm thế nào bạn có thể xác định chính xác một biến trong PHP?

Quy tắc cho các biến PHP:..
Một biến bắt đầu với dấu $, theo sau là tên của biến ..
Một tên biến phải bắt đầu bằng một chữ cái hoặc ký tự dấu gạch dưới ..
Một tên biến không thể bắt đầu với một số ..
Một tên biến chỉ có thể chứa các ký tự alpha-numeric và nhấn mạnh (A-Z, 0-9 và _).

Chỉ số không xác định có nghĩa là gì trong PHP?

Lưu ý chỉ mục không xác định trong PHP là một lỗi xảy ra khi chúng ta cố gắng truy cập giá trị hoặc biến thậm chí không tồn tại trong thực tế.Chỉ mục không xác định là lỗi thông thường xuất hiện khi chúng tôi cố gắng truy cập biến không tồn tại.