php là null hay rỗng?


207

Tôi có một câu hỏi liên quan đến NULLPHP:

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

Tại sao tôi thấy là null khi $amột chuỗi rỗng? Đó có phải là một lỗi không?

Câu trả lời:


347

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

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

Lưu ý ===.
Khi sử dụng ==, như bạn đã làm, PHP xử lý NULL , sai sự thật , 0 , các sản phẩm nào chuỗi, và trống mảng như bằng nhau.


13
Sai, điều kiện của bạn chỉ phù hợp với uninitialized và null $variable. Những gì bạn muốn thực sự là: $variable == null(lưu ý ==)
Thomas LAURENT

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

3
Lỗi của tôi, nhưng câu cuối cùng của bạn khiến tôi nghĩ rằng NULL, sai, 0 và "" hoàn toàn bằng nhau, đó là sai, xin lỗi vì sự hiểu lầm.
Thomas LAURENT

3
@James đó là một hành vi dự định trong PHP, nó vẫn đúng ngay cả trong năm 2017 và sẽ đúng trong một thời gian dài tôi cho rằng
Chống phân mảnh

1
$a = ''là một rỗng string, falselà một boolean, $a = 0;là một số nguyên và nulllà từ loại null. Điều OP đang nói là PHP sẽ xâu chuỗi chúng theo giá trị "giống nhau", nhưng không phải là "giống nhau" về kiểu. Vì vậy, kiểm tra nghiêm ngặt === cũng sẽ kiểm tra loại và thất bại nếu bạn sử dụng các loại khác nhau. Đó là lý do bạn nên nhất quán trong các giá trị trả về của bạn. Nếu bạn bình thường trả về một chuỗi trong một phương thức như getName(), bạn không nên nhận nullkhi nó trống, nhưng nhiều khả năng là một chuỗi emtpy $user->getName() === ''hoặc $user->getId() === 0hoặc $user->isActive === false. Dự định hành vi!
Cagatay Ulubay

225

Như được hiển thị trong bảng sau, empty($foo)tương đương $foo==nullis_null($foo)có cùng chức năng $foo===null. Bảng này cũng cho thấy một số giá trị khó khăn liên quan đến việc nullso sánh. (biểu thị một biến chưa được khởi tạo.)

         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   

Tôi không bao giờ sử dụng empty()is_null()chức năng. Sử dụng so sánh đơn giản là ít mơ hồ, nhanh hơn và sạch hơn. Đặc biệt sẽ có ít dấu ngoặc nhọn để phù hợp.

ví dụ if($x==null || $y==null)vsif(is_null($x) || is_null($y))


2
Thiếu "0" và "0,0" trong bảng. Họ làm cho mọi thứ thực sự khó khăn, đặc biệt là trống rỗng (). Đó là lý do tại sao tôi tránh sử dụng sản phẩm nào ().
datan.io

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

@hyip ==null===null.
PHP

Đây phải là câu trả lời hàng đầu, đầy đủ hơn nhiều. Cảm ơn.
pgr

@PHPst Bạn nói rằng so sánh đơn giản là ít mơ hồ. Bạn có thể vui lòng cung cấp một ví dụ về việc sử dụng so sánh đơn giản thay vì các NULL trống (), v.v.
Naeem Ul Wahhab

28

kiểm tra ==so với===

'' == NULLsẽ trả lại đúng
0 == NULLsẽ trả lại đúng
false == nullsẽ trả lại đúng

trong khi

'' === NULLsẽ trả về false
0 === NULLsẽ trả về false
false === NULLsẽ trả về false


Đã kiểm tra và sửa lỗi. '' == null (đúng) trong khi '' === null (sai)
TheLegendaryCopyCoder

18

Không, đó không phải là lỗi. Hãy xem các so sánh lỏng lẻo với bảng == ( bảng thứ hai), cho thấy kết quả so sánh từng 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, NULLhoặc ""sẽ mang lại thành sự thật.

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


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 kết quả đúng. chuyện gì đang xảy ra ở đó vậy?
Robert

1
@Robert: Một chuỗi không bắt đầu bằng chữ số được chuyển đổi thành 0khi được chuyển thành chuỗi: codepad.org/qi40SG3E . Vì vậy (int)"php" == 0.
Felix Kling

@Robert: Ý tôi là "khi chuyển sang số " .
Felix Kling

12

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

'' == null == 0 == false

Nếu bạn cũng 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, xin vui lòng đọc tài liệu chính thức .


8

Nếu bạn sử dụng ==, php coi một chuỗi hoặc mảng trống là null. Để phân biệt giữa nullempty, sử dụng ===hoặc is_null. Vì thế:

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


if ($ a === NULL)
Caster


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.