Menu

Hàm isset() trong PHP: kiểm tra biến hoặc khóa mảng

isset($var) trả về true khi biến tồn tại và khác null, ngược lại trả về false, không kèm cảnh báo nào. Hàm này còn kiểm tra được khóa mảng và thuộc tính đối tượng: isset($user['email']). Tìm hiểu isset với nhiều biến, khóa lồng nhau, isset và empty, isset và array_key_exists, cùng cách kiểm tra form đã được gửi.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

isset($var) trả về true nếu biến tồn tại và giá trị của nó khác null. Hàm trả về false với biến chưa định nghĩa, biến đã bị unset hoặc biến đang chứa null, và không bao giờ in ra cảnh báo.

isset() chỉ xét xem thứ gì đó có ở đó hay không. Một giá trị đã được gán nhưng rỗng, như 0, "" hoặc [], vẫn trả về true. Nếu bạn muốn "đã gán và không rỗng", hãy dùng empty (phủ định).

Kiểm tra khóa mảng có tồn tại bằng isset

Đây là chỗ isset() được dùng nhiều nhất. Đọc một khóa không tồn tại sẽ in ra Warning: Undefined array key với thiết lập PHP thông thường; kiểm tra nó bằng isset() trước thì không. Cách này cũng dùng được cho khóa lồng nhau, và lặng lẽ dừng lại ở cấp đầu tiên bị thiếu.

Khi bạn chỉ cần giá trị hoặc một giá trị mặc định, $user["website"] ?? "none" làm cùng phép kiểm tra trong một bước. Xem toán tử null coalescing.

isset với nhiều biến

Truyền nhiều đối số và isset() chỉ trả về true nếu tất cả đều đã được gán và khác null. Đây là cách ngắn gọn để kiểm tra mọi trường bắt buộc đã được gửi tới.

isset trên chuỗi và đối tượng

Với chuỗi, isset($str[5]) kiểm tra xem có ký tự ở vị trí 5 hay không, một cách kiểm tra độ dài nhanh. Với đối tượng, nó kiểm tra một thuộc tính; với lớp có dữ liệu private, isset() gọi phương thức __isset() nếu lớp có định nghĩa.

isset, empty và is_null

Chọn một giá trị của $x trong bảng để so sánh ba cách kiểm tra và phép ép kiểu (bool) thông thường. Mọi ô đều do PHP 8.3 tính ra.

isset, empty and is_null for each value of $x
Point at or tap a cell to read it as PHP.
$xissetemptyis_nullbool
null
false
0
"0"
""
" "
[]
"a"
1
0.0
"0.0"
Every cell computed by PHP 8.3.19.

Quy luật cần nhớ:

  • isset() là false chỉ với null và những thứ không tồn tại.
  • empty() là true với những thứ đó và với mọi giá trị falsy: false, 0, 0.0, "", "0", [].
  • is_null() cho kết quả ngược với isset() khi biến tồn tại, nhưng báo cảnh báo khi biến chưa được định nghĩa. Hãy dùng isset() hoặc === null thay thế.

Kiểm tra form đã được gửi chưa

isset() là cách kinh điển để xem một trường form đã được gửi tới chưa. Chạy khối này, nhập một cái tên và bấm Send: cùng script đó chạy lại với $_POST đã có dữ liệu.

Ô văn bản để trống vẫn được gửi, dưới dạng "", nên isset($_POST["name"]) là true sau mỗi lần gửi. Checkbox không được tích thì hoàn toàn không được gửi, nên isset() chính là phép kiểm tra đúng cho checkbox. Để yêu cầu giá trị không rỗng, hãy kiểm tra chuỗi sau khi trim như khối code trên. Trang form xây dựng một form hoàn chỉnh có kiểm tra dữ liệu.

isset và array_key_exists

Hai hàm cho cùng kết quả trong mọi trường hợp, trừ khóa có giá trị null. isset() coi khóa đó là không tồn tại, còn array_key_exists() thì không.

Nếu trong dữ liệu của bạn "được gán null" mang nghĩa khác với "chưa cấu hình", hãy dùng array_key_exists(). Còn lại thì isset() ngắn gọn hơn, và vì là cấu trúc ngôn ngữ chứ không phải lời gọi hàm, nó cũng nhanh hơn một chút.

Lỗi thường gặp: dùng isset với biểu thức

isset() chỉ nhận biến, phần tử mảng và thuộc tính. Truyền vào kết quả của một hàm hay một hằng số sẽ gây lỗi biên dịch:

<?php
if (isset(trim($input))) {}
PHP Fatal error:  Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in /home/index.php on line 2

Hãy lưu kết quả vào một biến trước, hoặc kiểm tra trực tiếp giá trị: null !== $expr như thông báo gợi ý, hoặc trim($input) !== "" với chuỗi.

Câu hỏi thường gặp

Hàm isset() trong PHP dùng để làm gì?

isset($x) trả về true nếu $x tồn tại và khác null, ngược lại trả về false. Hàm không bao giờ báo cảnh báo với biến hay khóa mảng chưa được định nghĩa, nên dùng an toàn với dữ liệu request như isset($_POST['email']).

isset() và empty() trong PHP khác nhau thế nào?

isset() hỏi "thứ này có tồn tại và khác null không"; empty() hỏi "thứ này bị thiếu hoặc falsy không". Với 0, "", "0" và [], isset() trả về true và empty() cũng trả về true. Với null hoặc khóa không tồn tại, isset() là false còn empty() là true. !empty($x) tương đương với việc isset($x) && $x là truthy.

isset() có kiểm tra được nhiều biến không?

Có: isset($a, $b, $c) chỉ trả về true nếu tất cả đều đã được gán và khác null. Hàm dừng lại ở biến đầu tiên chưa được gán.

Nên dùng isset() hay array_key_exists()?

Hai hàm chỉ khác nhau khi khóa tồn tại với giá trị null: isset($arr['k']) trả về false, còn array_key_exists('k', $arr) trả về true. Dùng array_key_exists khi null là một giá trị được lưu có ý nghĩa; còn lại thì isset ngắn gọn hơn và nhanh hơn một chút.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu