empty($var) trả về true nếu biến không tồn tại hoặc giá trị của nó là falsy: null, false, 0, 0.0, "", "0" hoặc mảng rỗng []. Với mọi giá trị khác, hàm trả về false. Giống isset(), nó không bao giờ cảnh báo về biến hay khóa mảng chưa định nghĩa.
empty($x) tương đương với !isset($x) || !$x. Nói cách khác: không tồn tại, hoặc chuyển thành false.
Những giá trị nào là rỗng
Chọn một giá trị trong bảng để xem empty() đặt cạnh isset() và phép ép kiểu (bool). Mọi ô đều do PHP 8.3 tính ra.
| $x | empty | isset | bool |
|---|---|---|---|
| null | |||
| false | |||
| 0 | |||
| 0.0 | |||
| "" | |||
| "0" | |||
| [] | |||
| " " | |||
| "0.0" | |||
| "a" | |||
| "null" | |||
| [0] | |||
| 1 | |||
| -1 |
Bất ngờ nằm ở cả hai đầu: "0" là rỗng, trong khi " " (một dấu cách), "0.0", "null" và [0] thì không.
"0" là rỗng: bug kinh điển
Vì "0" là falsy, empty() coi số lượng 0, điểm số 0 hay mã PIN "0" là "chưa nhập gì". Lỗi này hay gặp ở form, nơi mọi giá trị đều đến dưới dạng chuỗi.
Với dữ liệu văn bản, cách kiểm tra đáng tin cậy cho "chưa nhập gì" là trim($value) === "". Hãy giữ empty() cho những giá trị mà 0 thực sự có nghĩa là không có gì.
Kiểm tra chuỗi rỗng
Để kiểm tra chính xác một chuỗi rỗng, hãy so sánh với "". Để coi cả khoảng trắng là rỗng, hãy trim trước. Từ PHP 5.5, empty() nhận được biểu thức, nên empty(trim($s)) cũng chạy (nhưng vẫn gặp vấn đề với "0").
Từ PHP 8.1, trim() không nhận null mà không kèm thông báo deprecation, vì vậy khối code viết trim($s ?? "").
Kiểm tra mảng rỗng
Với mảng, empty($arr), $arr === [] và count($arr) === 0 đều cho cùng một kết quả. Ưu điểm của empty() là dùng được trên biến hoặc khóa có thể không tồn tại.
array_filter() không có callback sẽ loại bỏ mọi giá trị falsy, nên đây là cách nhanh để hỏi "mảng này có chứa gì thật sự không".
Kiểm tra trường bắt buộc trong form
!empty() là cách phổ biến để bắt buộc một trường, miễn là 0 không phải câu trả lời hợp lệ. Chạy khối này, để trống các trường và nhấn Send, rồi điền vào và gửi lại: script chạy thêm một lần với $_POST đã có dữ liệu.
empty($_POST["terms"]) bao quát cả hai trường hợp của checkbox: hoàn toàn không được gửi, hoặc được gửi với giá trị rỗng. Trang form đi xa hơn với thông báo lỗi cho từng trường.
empty và isset
Cả hai đều an toàn với biến và khóa chưa định nghĩa. Chúng trả lời những câu hỏi khác nhau:
isset($x): biến có tồn tại và khácnullkhông? Dùng cho khóa không bắt buộc, checkbox và câu hỏi "dữ liệu này có được gửi không".!empty($x): biến có tồn tại và là truthy không? Dùng cho "có giá trị thật sự", khi0và"0"không được tính.$x === ""hoặc$x === []: có đúng là rỗng không? Dùng khi0là giá trị hợp lệ.
Trang isset trình bày nửa còn lại, gồm cả isset() với nhiều biến cùng lúc và điểm khác biệt so với array_key_exists().
Câu hỏi thường gặp
empty() trong PHP coi những giá trị nào là rỗng?
empty($x) là true khi $x không tồn tại hoặc là null, false, 0, 0.0, "", "0" hay []. Mọi giá trị khác đều không rỗng, kể cả " " (một dấu cách), "0.0", "false" và [0].
Vì sao "0" lại là rỗng trong PHP?
empty() giống hệt !$x nhưng không cảnh báo khi biến chưa định nghĩa, và chuỗi "0" chuyển thành false. Vì vậy empty() không phù hợp với những trường mà 0 là câu trả lời hợp lệ; hãy kiểm tra $x === '' hoặc trim($x) === ''.
Làm sao kiểm tra một mảng có rỗng không trong PHP?
empty($arr) và $arr === [] đều dùng được, count($arr) === 0 cũng vậy. empty() còn trả về true khi biến chưa được gán, trong khi count() trên một biến chưa định nghĩa sẽ cảnh báo rồi ném ra TypeError vì nhận null.
Khi nào nên dùng empty() thay vì isset()?
Dùng isset() khi bạn chỉ cần biết giá trị có tồn tại hay không (một checkbox đã được gửi, một khóa cấu hình có mặt). Dùng !empty() khi giá trị còn phải khác rỗng, ví dụ một trường văn bản bắt buộc. Cẩn thận với những trường mà 0 là hợp lệ, vì empty('0') là true.