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.
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.
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.
Đ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.
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).
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
@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'. –
@Robert: Tôi có nghĩa là * "khi truyền đến ** **" *. –
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
Như được trình bày trong bảng dưới đây, empty($foo)
tương đương với $foo==null
và is_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()
và 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
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(). –
@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
@hyip '== null'and' === null'. – PHPst
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 null
và empty
, hãy sử dụng ===
hoặc is_null
. Vì vậy:
if($a === NULL)
hoặc if(is_null($a))
nếu ($ a === NULL) – Caster
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 ý' '' == '' ') –
@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
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. –