Isset () và blank () - sử dụng gì


105

Bạn có thể giúp tôi cải thiện phong cách viết mã của mình không? :) Trong một số tác vụ, tôi cần kiểm tra - biến trống hay chứa thứ gì đó. Để giải quyết công việc này, tôi thường làm như sau.

Kiểm tra - biến này có được đặt hay không? Nếu nó được đặt - tôi kiểm tra - nó trống hay không?

<?php
    $var = '23';
    if (isset($var)&&!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

Và tôi có một câu hỏi - tôi có nên sử dụng Isset () trước trống () - có cần thiết không? TIA!


trống là! Isset ($ var) || $ var == false
zloctb

2
trong đối lập của tôi, trống () là một sự phát triển kinh khủng của PHP. Vì nó coi "0" trong bất kỳ hình thức nào là "trống", bạn có thể rơi vào bẫy xấu tốn rất nhiều thời gian gỡ lỗi. Tôi muốn nói: tránh bằng mọi giá và chỉ cần tự viết logic
John

Câu trả lời:


143

Nó phụ thuộc vào những gì bạn đang tìm kiếm, nếu bạn chỉ muốn xem nó có trống hay không, chỉ cần sử dụng emptyvì nó kiểm tra xem nó đã được thiết lập hay chưa, nếu bạn muốn biết liệu cái gì đó đã được thiết lập hay chưa isset.

Empty kiểm tra xem biến đã được đặt chưa và nếu đúng thì nó sẽ kiểm tra giá trị null, "", 0, v.v.

Isset chỉ cần kiểm tra xem nó đã được đặt chưa, nó có thể là bất kỳ thứ gì không phải là null

Với empty, những thứ sau được coi là trống rỗng:

  • "" (một chuỗi trống)
  • 0 (0 dưới dạng số nguyên)
  • 0.0 (0 dưới dạng số float)
  • "0" (0 dưới dạng một chuỗi)
  • VÔ GIÁ TRỊ
  • SAI
  • array () (một mảng trống)
  • var $ var; (một biến được khai báo, nhưng không có giá trị trong một lớp)

Từ http://php.net/manual/en/ Chức năng.empty.php


Như đã đề cập trong các bình luận, việc thiếu cảnh báo cũng rất quan trọng với trống ()

Hướng dẫn sử dụng PHP cho biết

void () đối lập vớ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 .

Liên quan tới Isset

Hướng dẫn sử dụng PHP cho biết

Isset () sẽ trả về FALSE nếu kiểm tra một biến đã được đặt thành NULL


Mã của bạn sẽ ổn khi:

<?php
    $var = '23';
    if (!empty($var)){
        echo 'not empty';
    }else{
        echo 'is not set or empty';
    }
?>

Ví dụ:

$var = "";

if(empty($var)) // true because "" is considered empty
 {...}
if(isset($var)) //true because var is set 
 {...}

if(empty($otherVar)) //true because $otherVar is null
 {...}
if(isset($otherVar)) //false because $otherVar is not set 
 {...}

Nó có nghĩa là - trong đoạn mã trên tôi kiểm tra có thể thay đổi thiết lập hay không gấp đôi :)?
Dmitry Belaventsev

Chỉ cần kiểm tra xem nó có trống hay không, php sẽ không báo lỗi nếu không phải như vậy.
Pez Cuckow

3
Bạn đang bỏ qua điểm lớn nhất empty: Nó không đưa ra cảnh báo khi biến được kiểm tra không tồn tại. Đó là toàn bộ điểm của chức năng này, nếu không thì nó giống hệt == false.
dối trá

1
Vì vậy, thực tế là "không có cảnh báo nào được tạo ra khi biến không được đặt" làm tôi bối rối. Không có cảnh báo không có nghĩa là tôi sẽ không gặp rắc rối trong đoạn mã dưới đây. Bây giờ thì rõ ràng cho tôi. Cảm ơn nhiều!
Dmitry Belaventsev

"Isset chỉ kiểm tra nếu nó được đặt, nó vẫn có thể là null" Điều đó không đúng: issettrên một biến null (và hiện tại) sẽ đánh giá thành false.
netcoder

12

Trong trường hợp cụ thể của bạn: if ($var).

Bạn cần sử dụng issetnếu bạn không biết liệu biến có tồn tại hay không. Vì bạn đã khai báo nó ngay dòng đầu tiên, bạn biết nó tồn tại, do đó bạn không cần, nay, không nên sử dụng isset.

Cũng vậy với empty, duy nhất mà emptycũng kết hợp một tấm séc cho truthiness giá trị. emptytương đương với !isset($var) || !$var!emptytương đương với isset($var) && $var, hoặc isset($var) && $var == true.

Nếu bạn chỉ muốn kiểm tra một biến mà nên tồn tại cho truthiness , if ($var)là hoàn toàn phù hợp và cho điểm.


Điều này giải thích tốt hơn nhiều. Nếu chúng ta có được sự so sánh cho tất cả các trường hợp khác như thế này !empty is equivalent to isset($var) && $var, thì thật tuyệt vời. Cảm ơn @deceze
Vir

6

Bạn chỉ có thể sử dụng void () - như đã thấy trong tài liệu , nó sẽ trả về false nếu biến không có giá trị.

Một ví dụ trên cùng trang đó:

<?php
$var = 0;

// Evaluates to true because $var is empty
if (empty($var)) {
    echo '$var is either 0, empty, or not set at all';
}

// Evaluates as true because $var is set
if (isset($var)) {
    echo '$var is set even though it is empty';
}
?>

Bạn có thể sử dụng Isset nếu bạn chỉ muốn biết nếu nó không phải là NULL. Nếu không, nó có vẻ như trống () chỉ sử dụng một mình là tốt.


Giải thích cho cuộc bỏ phiếu xuống? Anh ấy không hỏi liệu chúng có giống nhau hay không, anh ấy hỏi liệu anh ấy có cần phải kiểm tra Isset trước khi đánh dấu trống không.
chris

Tôi không downvote, nhưng "sử dụng isset nếu bạn muốn biết nó không phải là null" là không đúng: $var = null; isset( $var ) == true.
JJJ

Từ Hướng dẫn sử dụng PHP5 / 4: Isset () - "Xác định xem một biến có được đặt và không phải là NULL hay không." us.php.net/manual/en/ Chức năng.isset.php
chris

2

Đây là kết quả đầu ra của isset()empty()cho 4 khả năng: không khai báo, null, sai và đúng.

$a=null;
$b=false;
$c=true;

var_dump(array(isset($z1),isset($a),isset($b),isset($c)),true); //$z1 previously undeclared
var_dump(array(empty($z2),empty($a),empty($b),empty($c)),true); //$z2 previously undeclared

//array(4) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(true) [3]=> bool(true) } 
//array(4) { [0]=> bool(true) [1]=> bool(true) [2]=> bool(true) [3]=> bool(false) } 

Bạn sẽ nhận thấy rằng tất cả các kết quả 'Isset' đối lập với các kết quả 'trống' ngoại trừ trường hợp $b=false. Tất cả các giá trị (ngoại trừ null không phải là giá trị mà không phải là giá trị) đánh giá thành false sẽ trả về true khi được kiểm tra bởi issetvà false khi được kiểm tra bằng 'trống'.

Vì vậy, hãy sử dụng isset()khi bạn lo lắng về sự tồn tại của một biến. Và sử dụng emptykhi bạn đang kiểm tra đúng hay sai. Nếu các loại thực tế của vấn đề trống rỗng, sử dụng is_null===0, ===false, ===''.


1

Giá trị rỗng trả về true nếu var không được đặt. Nhưng Isset trả về true ngay cả khi var không trống.


-3
$var = 'abcdef';
if(isset($var))
{
   if (strlen($var) > 0);
   {
      //do something, string length greater than zero
   }
   else
   {
     //do something else, string length 0 or less
   }
}

Đây là một ví dụ đơn giản. Hy vọng nó giúp.

chỉnh sửa: được thêm vào issettrong trường hợp một biến không được xác định như trên, nó sẽ gây ra lỗi, kiểm tra xem liệu ít nhất tập đầu tiên của nó có giúp loại bỏ một số vấn đề đau đầu trong quá trình thực hiện hay không.


7
strlen dưới 0? Tôi muốn xem chuỗi đó.
dối trá

@deceze Chỉ là một ví dụ sơ bộ :) OK use = 0 not <0
Akos
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.