Tại sao phải kiểm tra cả ngay bây giờ () và! Trống ()


269

Có sự khác biệt giữa isset!empty. Nếu tôi thực hiện kiểm tra boolean kép này, nó có đúng theo cách này hay không? và có cách nào ngắn hơn để làm điều tương tự không?

isset($vars[1]) AND !empty($vars[1])

3
Có một biểu đồ đẹp về kết quả của việc sử dụng chúng với các loại biến khác nhau (chúng có sự khác biệt) ở đây: virendrachandak.com/demos/php-isset-vs-empty-vs-is_null.php
Jeff Clayton

Các bổ sung chính xác rõ ràng là ngay lập tức và is_null, nhưng! Trống bao gồm một vài cái khác nhau. Tất cả phụ thuộc vào loại dữ liệu bạn đang kiểm tra.
Jeff Clayton

Câu trả lời:


419

Điều này là hoàn toàn dư thừa. emptylà ít hoặc ít tốc ký cho !isset($foo) || !$foo, và !emptytương tự như isset($foo) && $foo. Tức là emptylàm điều ngược lại với issetcộng với một kiểm tra bổ sung cho truthiness của một giá trị.

Hay nói cách khác, emptygiống như !$foo, nhưng không đưa ra cảnh báo nếu biến không tồn tại. Đó là điểm chính của chức năng này: thực hiện so sánh boolean mà không cần lo lắng về biến được đặt.

Hướng dẫn đặt nó như thế này:

empty()ngược lại (boolean) var, ngoại trừ việc không có cảnh báo nào được tạo khi biến không được đặt.

Bạn chỉ có thể sử dụng !empty($vars[1])ở đây.


7
Nhưng nếu không có $vars[1]anh sẽ nhận được thông báo.
karim79

6
Tôi không biết tôi lấy ý tưởng đó từ đâu. Cộng thêm một người.
karim79

8
@karim IMO emptylà một trong những hàm bị hiểu sai nhiều nhất trong PHP. Đoạn trích nhỏ về "không có cảnh báo nào được tạo ra" rất dễ bị bỏ qua. Tôi đã phải quét tài liệu một vài lần để phát hiện ra nó để đăng nó ở đây.
lừa dối

2
empty($vars[1])không gây ra bất kỳ cảnh báo nào thậm chí $vars[1]không được thiết lập, nhưng echo $vars[1]sẽ. Tôi đã kiểm tra thực tế bằng cách sử dụng echo $vars[1]; if (!empty($vars[1])) echo 1; else echo 0;.
Amil Waduwawara

4
@Shahor Nhiều ngôn ngữ coi 0false. PHP không phải là người duy nhất. Vẫn không chắc chắn khiếu nại của bạn là gì.
lừa dối

33

isset() kiểm tra nếu một biến được đặt và không null:

http://us.php.net/manual/en/feft.isset.php

empty() có thể trả về true khi biến được đặt thành các giá trị nhất định:

http://us.php.net/manual/en/feft.empty.php

Để chứng minh điều này, hãy thử đoạn mã sau với $ the_var chưa được gán, đặt thành 0 và đặt thành 1.

<?php

#$the_var = 0;

if (isset($the_var)) {
  echo "set";
} else {
  echo "not set";
}

echo "\n";

if (empty($the_var)) {
  echo "empty";
} else {
  echo "not empty";
}
?>

12

Câu trả lời được chấp nhận là không chính xác.

isset () KHÔNG tương đương với! trống ().

Bạn sẽ tạo ra một số lỗi khá khó chịu và khó gỡ lỗi nếu bạn đi xuống tuyến đường này. ví dụ: thử chạy mã này:

<?php

$s = '';

print "isset: '" . isset($s) . "'. ";
print "!empty: '" . !empty($s) . "'";

?>

https://3v4l.org/J4nBb


7
Câu trả lời được chấp nhận không có cách nào cho thấy điều đó issettương đương với !empty.
lừa dối

8
$a = 0;
if (isset($a)) { //$a is set because it has some value ,eg:0
    echo '$a has value';
}
if (!empty($a)) { //$a is empty because it has value 0
    echo '$a is not empty';
} else {
    echo '$a is empty';
}

1
Nhưng bạn chưa xử lý biến không đặt trường hợp.
Amil Waduwawara

3

Trống chỉ kiểm tra là biến / mảng được giới thiệu có giá trị nếu bạn kiểm tra tài liệu php (trống) bạn sẽ thấy những thứ này được coi là emtpy

* "" (an empty string)
* 0 (0 as an integer)
* "0" (0 as a string)
* NULL
* FALSE
* array() (an empty array)
* var $var; (a variable declared, but without a value in a class)

trong khietet kiểm tra xem biến ngay lập tức và không null cũng có thể được tìm thấy trong tài liệu php (isset)


2

Nó không phải là cần thiết.

Không có cảnh báo nào được tạo nếu biến không tồn tại. Điều đó có nghĩa là rỗng () về cơ bản là tương đương ngắn gọn với! Oseet ($ var) || $ var == sai.

php.net


2
Điều này chưa bao giờ là cần thiết trên bất kỳ phiên bản PHP nào, vì trống đã kiểm tra (không) ngay lập tức. Bạn đang nhầm lẫn thực tế là bây giờ trống hỗ trợ các biểu thức với câu hỏi.
alxgb

Nó chỉ đúng, năm năm sau.
Lennon

2

isset($vars[1]) AND !empty($vars[1])tương đương với !empty($vars[1]).

Tôi đã chuẩn bị mã đơn giản để hiển thị nó theo kinh nghiệm.

Hàng cuối cùng là biến không xác định.

+-----------+---------+---------+----------+---------------------+
| Var value | empty() | isset() | !empty() | isset() && !empty() |
+-----------+---------+---------+----------+---------------------+
| ''        | true    | true    | false    | false               |
| ' '       | false   | true    | true     | true                |
| false     | true    | true    | false    | false               |
| true      | false   | true    | true     | true                |
| array ()  | true    | true    | false    | false               |
| NULL      | true    | false   | false    | false               |
| '0'       | true    | true    | false    | false               |
| 0         | true    | true    | false    | false               |
| 0.0       | true    | true    | false    | false               |
| undefined | true    | false   | false    | false               |
+-----------+---------+---------+----------+---------------------+

Và mã

$var1 = "";
$var2 = " ";
$var3 = FALSE;
$var4 = TRUE;
$var5 = array();
$var6 = null;
$var7 = "0";
$var8 = 0;
$var9 = 0.0;

function compare($var)
{
    print(var_export($var, true) . "|" .
        var_export(empty($var), true) . "|" .
        var_export(isset($var), true) . "|" .
        var_export(!empty($var), true) . "|" .
        var_export(isset($var) && !empty($var), true) . "\n");
}

for ($i = 1; $i <= 9; $i++) {
    $var = 'var' . $i;
    compare($$var);
}

@print(var_export($var10, true) . "|" .
    var_export(empty($var10), true) . "|" .
    var_export(isset($var10), true) . "|" .
    var_export(!empty($var10), true) . "|" .
    var_export(isset($var10) && !empty($var10), true) . "\n");

Biến không xác định phải được đánh giá ngoài hàm, vì chính hàm tạo biến tạm thời trong chính phạm vi.


0

"Trống": chỉ hoạt động trên các biến. Trống có thể có nghĩa là những thứ khác nhau cho các loại biến khác nhau (kiểm tra hướng dẫn sử dụng: http://php.net/manual/en/feft.empty.php ).

"isset": kiểm tra xem biến có tồn tại không và kiểm tra giá trị NULL đúng hay sai. Có thể không được đặt bằng cách gọi "unset". Một lần nữa, kiểm tra hướng dẫn.

Việc sử dụng một trong hai loại phụ thuộc vào loại biến bạn đang sử dụng.

Tôi sẽ nói, sẽ an toàn hơn khi kiểm tra cả hai, bởi vì trước hết bạn đang kiểm tra xem biến đó có tồn tại không và nếu nó không thực sự là NULL hay trống.


3
@szahn "an toàn hơn để kiểm tra cả hai", - bạn là lập trình viên có thể kiểm tra mọi thứ bạn muốn cho sự an toàn. Nhưng nếu mã của bạn là dự phòng thì bạn có thể dự phòng là lập trình viên.
madlopt

0

nếu chúng tôi sử dụng cùng một trang để thêm / chỉnh sửa thông qua nút gửi như bên dưới

<input type="hidden" value="<?echo $_GET['edit_id'];?>" name="edit_id">

sau đó chúng ta không nên sử dụng

isset($_POST['edit_id'])

bcoz edit_idđược đặt mọi lúc cho dù đó là thêm hoặc chỉnh sửa trang, thay vào đó chúng ta nên sử dụng kiểm tra dưới điều kiện

!empty($_POST['edit_id'])

bài viết trước đã được gửi bcoz tôi nhấn enter do nhầm lẫn, đây là câu trả lời đầy đủ của tôi ... tại sao downvote? :(
diEcho

0
  • Từ trang web PHP, tham khảo empty()chức năng:

Trả về FALSEnếu varcó giá trị không trống và khác không.

Đó là một điều tốt để biết. Nói cách khác, mọi thứ từ NULL, đến 0đến tầm khắc sẽ trở lại TRUEkhi sử dụng empty()chức năng.

  • Dưới đây là mô tả về những gì isset()hàm trả về:

Trả về TRUEnếu vartồn tại; FALSEnếu không thì.

Nói cách khác, chỉ các biến không tồn tại (hoặc, các biến có NULLgiá trị nghiêm ngặt ) sẽ trả FALSEvề isset()hàm. Tất cả các biến có bất kỳ loại giá trị nào, cho dù đó là 0, một chuỗi văn bản trống, v.v. sẽ trả về TRUE.

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.