2011-11-23 39 views
128

Tôi có một câu hỏi kỳ lạ liên quan đến PHP và NULL, vui lòng xem đoạn mã sau:php là rỗng hoặc trống?

$a = ''; 
    if($a == NULL) { 
     echo 'is null'; 
    } 

Tại sao tôi thấy là null? nếu $a trống !, đó có phải là lỗi không? Cảm ơn bạn.

Trả lời

233

Những gì bạn đang tìm kiếm là:

if($variable === NULL) {...} 

PHP xử lý NULL, sai, , và chuỗi trống như bằng nhau.

+4

False, tình trạng của bạn chỉ phù hợp chưa được khởi tạo và null '' '$ variable'''. Những gì bạn muốn thực sự là: '' '$ variable == null''' (lưu ý' '' == '' ') –

+3

@ThomasLAURENT, đó là những gì OP đang tìm kiếm, họ đã tự hỏi tại sao' == null 'đã khớp chuỗi rỗng và không chỉ là null hoặc không xác định. – Godwin

+1

Oups sai lầm của tôi, nhưng câu cuối cùng của bạn đã dẫn tôi nghĩ rằng NULL, false, 0 và "" là ** nghiêm chỉnh ** bình đẳng đó là sai, xin lỗi vì sự hiểu lầm. –

10

Điều này không phải là lỗi nhưng hành vi bình thường của PHP. Điều này xảy ra vì toán tử == trong PHP không kiểm tra loại.

'' == null == 0 == false 

Nếu bạn muốn kiểm tra xem các giá trị có cùng loại hay không, hãy sử dụng === để thay thế. Để nghiên cứu sâu về sự khác biệt này, vui lòng đọc số official documentation.

15

Không, đó không phải là lỗi. Có một cái nhìn tại Loose comparisons with == table (bảng thứ hai), trong đó cho thấy kết quả của việc so sánh mỗi giá trị trong cột đầu tiên với các giá trị trong các cột khác:

TRUE FALSE 1  0  -1  "1"  "0"  "-1" NULL array() "php" "" 

    [...]  

"" FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE 

Ở đó bạn có thể thấy rằng một chuỗi rỗng "" so với false , 0, NULL hoặc "" sẽ mang lại giá trị đúng.

Bạn có thể muốn sử dụng is_null[docs] để thay thế hoặc so sánh nghiêm ngặt (bảng thứ ba).

+0

Bảng so sánh lỏng lẻo dường như gợi ý rằng so sánh 0 == "php" hoặc "php" == 0 sẽ mang lại hiệu quả đúng. chuyện gì đang xảy ra ở đó vậy? – Robert

+1

@Robert: Chuỗi không bắt đầu bằng chữ số được chuyển thành '0' khi truyền thành chuỗi: http://codepad.org/qi40SG3E. Vì vậy, '(int)" php "== 0'. –

+0

@Robert: Tôi có nghĩa là * "khi truyền đến ** **" *. –

18

séc == vs ===

'' == NULL sẽ trở thành sự thật
0 == NULL sẽ trở thành sự thật
false == null sẽ trở thành sự thật

nơi như

'' === NULL sẽ trả về false
0 === NULL sẽ trả về false
false === NULL sẽ trả về false

171

Như được trình bày trong bảng dưới đây, empty($foo) tương đương với $foo==nullis_null($foo) có chức năng tương tự của $foo===null. Bảng này cũng cho thấy một số giá trị phức tạp liên quan đến việc so sánh null. (ϕ biểu thị một biến không được khởi tạo.)

Tôi không bao giờ sử dụng các chức năng empty()is_null(). Sử dụng so sánh đơn giản ít mơ hồ hơn, nhanh hơn và sạch hơn.

  empty is_null 
     ==null ===null isset array_key_exists 
     ϕ | T | T | F | F 
    null | T | T | F | T 
    "" | T | F | T | T 
    [] | T | F | T | T 
     0 | T | F | T | T  
    false | T | F | T | T 
    true | F | F | T | T 
     1 | F | F | T | T 
    \0 | F | F | T | T 
+1

Thiếu "0" và "0.0" trong bảng. Chúng làm cho mọi thứ trở nên phức tạp, đặc biệt là rỗng(). Đó là lý do tại sao tôi tránh sử dụng empty(). –

+0

@PHPst Dựa trên bảng mà bạn đã hiển thị, vậy mã thực sự là mã php của cái mà bạn gọi là 'so sánh đơn giản' là gì? – hyip

+0

@hyip '== null'and' === null'. – PHPst

5

Nếu bạn sử dụng ==, php đối xử với một chuỗi rỗng hoặc mảng như null. Để phân biệt giữa nullempty, hãy sử dụng === hoặc is_null. Vì vậy:

if($a === NULL) hoặc if(is_null($a))

+0

nếu ($ a === NULL) – Caster

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