Sự khác biệt giữa is_null ($ var) và ($ var === null) là gì?


83

Có sự khác biệt nào giữa điều này ...

if (is_null($var)) {
    do_something();
}

và điều này?

if ($var === null) {
    do_something();
}

Dạng nào tốt hơn khi kiểm tra xem một biến có chứa null hay không? Có bất kỳ trường hợp cạnh nào mà tôi nên biết không? (Tôi khởi tạo tất cả các biến của mình, vì vậy các biến không tồn tại không phải là vấn đề.)


5
Bạn sẽ nghĩ rằng ===toán tử sẽ nhanh hơn vì nó không phải là một hàm rõ ràng ... nhưng tôi đã ngạc nhiên một hoặc hai lần.
John Giotta

Câu trả lời:


30

Với điều kiện biến được khởi tạo (mà bạn đã chỉ ra - mặc dù tôi không chắc 100% liệu điều này có quan trọng trong ngữ cảnh này hay không. Cả hai giải pháp đều có thể đưa ra cảnh báo nếu biến không được xác định), chúng đều giống nhau về mặt chức năng. Tôi cho rằng ===sẽ nhanh hơn một chút vì nó loại bỏ chi phí của một lệnh gọi hàm.

Nó thực sự phụ thuộc vào cách bạn nhìn vào tình trạng của mình.

===là để so sánh dữ liệu chặt chẽ. NULL chỉ có một 'giá trị', vì vậy điều này hoạt động để so sánh với NULL (là một hằng số PHP của 'giá trị' null)

is_null đang kiểm tra xem biến có thuộc kiểu dữ liệu NULL hay không.

Thực sự thì tùy thuộc vào bạn mà bạn chọn.


2
Cảm ơn bạn đã giải thích so sánh theo giá trị so với so sánh theo loại.
kijin

4
Tôi thích is_nullbiến thể hơn, vì nó rất dễ vô tình sử dụng == nullthay thế === null. Vì == nulltương tự như empty(xem câu trả lời khác), điều này dẫn đến khả năng xảy ra lỗi của lập trình viên (đặc biệt là cấp cơ sở và cấp trung) lớn hơn là một lỗi đơn giản và dễ đọc is_null.
ryanm

101

true

false

        | isset   | is_null | ===null | ==null  | empty   |
|-------|---------|---------|---------|---------|---------|
|  null |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|  true |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| false |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     0 |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     1 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
|    \0 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| unset |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|   ""  |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |

Tổng kết: 🔸 ♦ ️🔸

  • empty tương đương với ==null
  • is_null tương đương với ===null
  • issetlà nghịch đảo của is_null===null

12
Tôi thực sự yêu cái bàn này.
Cheok Yan Cheng

3
nó có thể làm cho bàn một chút rõ ràng hơn để có cột đầu tiên được đặt tên $vđể đại diện cho một số biến chung chung, và sau đó những người khác isset($v), is_null($v), $v===nullvà vân vân
Brandin

@Brandin Cảm ơn bạn đã gợi ý. Vui lòng chỉnh sửa câu trả lời.
PHPst

4
@Pacerier Rõ ràng đã nói chúng tương đương nhau, vì vậy không có sự khác biệt về chức năng.
PHPst

1
issetsẽ không phàn nàn về một biến không xác định, nó sẽ trả về false. Sử dụng is_nullhoặc === nullsẽ dẫn đến một thông báo.
user1431317

17

Cả hai đều giống hệt nhau, tôi sử dụng is_nullvì nó làm cho mã của tôi dễ đọc hơn


3
và trong khi === lúc đầu có thể nhanh hơn, trình tối ưu hóa PHP sẽ khắc phục điều đó.
foo

10
Tôi cảm thấy is_nullthực sự là ít rõ ràng hơn. Mặc dù nó có thể đọc tốt, $v === nullkhông nghi ngờ gì rằng việc so sánh được thực hiện với ngữ nghĩa chặt chẽ, nhưng với is_null($v)một số lập trình viên sẽ tự hỏi liệu nó có sử dụng ===hay ==ngữ nghĩa hay không .

4
@goat, ish1301, Ngoài ra, is_nullcó thể bị xóa hoặc xác định lại hoàn toàn, trong khi === nullsẽ luôn hoạt động.
Pacerier

@Pacerier trong khi ví dụ của bạn rất thú vị, khả năng ai đó cài đặt gói pecl runkit, sau đó thiết lập nó để cho phép xóa các hàm tích hợp sẵn và sau đó xóa is_null, của tất cả mọi thứ, mà không thay thế nó bằng thứ gì đó rất gần với nil hoặc null nếu bạn thích. Tình huống duy nhất mà tôi có thể nghĩ đến khi một người muốn xóa is_null, là nếu họ muốn thay đổi hành vi của so sánh null trên toàn cầu. Ví dụ; trả về false thay vì true cho unset; Trong trường hợp này, nó thực sự chỉ có thể nếu mã được viết bằng is_null để bắt đầu.
kaan_a

7

Nếu php có quá nhiều hàm kiểu is_foo () có vẻ thừa, khi bạn chỉ có thể sử dụng các toán tử so sánh tiêu chuẩn, hãy xem xét các hàm được gọi theo chương trình.

$arrayOfNullValues = array_filter($myArray, 'is_null');

$arrayWithoutNullValuessau đó sẽ lưu trữ một mảng chỉ có null các giá trị.
PointedEars

5

Tôi vừa chạy một điểm chuẩn nhanh, thử nghiệm một triệu lần lặp lại của mỗi cái. is_nullmất 8 giây để hoàn thành; === nulllấy 1.

Vì vậy, cuộc gọi đến is_nullchậm hơn 0,000007 giây so với cuộc gọi đến ===trên máy tính của tôi.

Tôi muốn tìm thứ gì đó hữu ích hơn để tối ưu hóa.


Mã của tôi:

<?php

$start = time();
$var = null;

for ($i = 1000000; $i--; ) {
    is_null($var);
}

echo time() - $start;

$start = time();

for ($i = 1000000; $i--; ) {
    $var === null;
}

echo time() - $start;

1
Thật thú vị, PHP / 7 dường như đã giải quyết vấn đề này và hiệu suất hiện gần như giống hệt nhau; trên thực tế, is_null()nhanh hơn một chút trong máy tính của tôi dưới Win32 7.1.9.
Álvaro González

@ ÁlvaroGonzález Tôi cũng nhận thấy điều tương tự. Sự khác biệt là không đáng kể giữa hai chức năng. (is_null: 0.54486592610677, === null: 0.7440135592506) ở 10.000 thao tác. Thử nghiệm đã được chạy 30 lần và những con số này là trung bình.
Justin E


0

is_null($var)chậm hơn khoảng 14 lần so với $var===null... 37,8 ms so với 2,6 ms.

Nhưng thực ra tôi không biết tại sao.


0

Một điều mà mọi người thường quên đề cập trong cuộc thảo luận này là nếu bạn muốn kiểm tra kiểu nghiêm ngặt, is_nullsẽ giúp bạn không bao giờ mắc lỗi chính tả trong các toán tử so sánh của mình (== so với ===).

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.