?? trả về giá trị bên trái nếu nó tồn tại và khác null, ngược lại trả về giá trị bên phải: $name = $_GET['name'] ?? 'Guest';. Khác với đọc khóa trực tiếp, nó không bao giờ cảnh báo khi biến hoặc khóa mảng bị thiếu.
Ở lần chạy đầu không có query string, nên cả hai giá trị mặc định đều được dùng. Nhấn một liên kết trong tab Trang và script chạy lại với $_GET đã có dữ liệu. Đọc $_GET["name"] mà không có ?? ở lần chạy đầu đó sẽ in ra Warning: Undefined array key "name" trên một cài đặt PHP bình thường. Xem thêm về dữ liệu request ở trang _POST.
?? là cách kiểm tra isset() rút gọn
$a ?? $b nghĩa chính xác là isset($a) ? $a : $b. Nó dùng được với biến, khóa mảng ở bất kỳ độ sâu nào và thuộc tính đối tượng, và dừng lại ở phần bị thiếu đầu tiên mà không báo gì.
Phép kiểm tra này giống hệt cái mà isset làm, nên một khóa tồn tại nhưng có giá trị null cũng nhận giá trị mặc định.
Nối nhiều ?? để thử nhiều nguồn
?? kết hợp từ phải sang trái và bạn có thể nối bao nhiêu tùy thích. PHP trả về toán hạng đầu tiên đã được đặt và khác null.
??= chỉ gán khi là null
$a ??= $b lưu $b vào $a chỉ khi $a chưa được đặt hoặc là null. Đây là cách ngắn nhất để điền giá trị mặc định, hoặc để tính một thứ một lần rồi dùng lại.
Vế phải của ??= chỉ được tính khi phép gán xảy ra, vì vậy computing 4 chỉ xuất hiện một lần.
?? và ?: (toán tử ba ngôi rút gọn)
?? kiểm tra null. ?: kiểm tra tính truthy. Với các giá trị như 0, "" và "0", chúng cho kết quả khác nhau:
Số lượng "0" là dữ liệu nhập thật: ?? giữ nó, ?: thay nó. Bản thân ?: sẽ cảnh báo khi khóa bị thiếu, vì vậy khối code bọc nó lại thành ($inputs[$key] ?? null) ?: .... Trang toán tử ba ngôi nói về chính ?:.
Toán tử nullsafe ?->
?-> là phiên bản dành cho đối tượng của cùng ý tưởng đó, có từ PHP 8. Nếu đối tượng bên trái là null, cả chuỗi dừng lại và trả về null thay vì ném ra một Error như Call to a member function getAddress() on null. Đặt ?? ở cuối để có giá trị mặc định.
Người dùng 2 có tồn tại nhưng không có địa chỉ, còn người dùng 3 hoàn toàn không tồn tại. Cả hai đều đến được giá trị mặc định ?? "unknown" mà không có lỗi.
Lỗi thường gặp: ?? có độ ưu tiên thấp
?? có độ ưu tiên thấp hơn . và các toán tử số học. Vì vậy trong "Count: " . $count ?? 0, PHP dựng chuỗi "Count: " . $count trước, chuỗi này không bao giờ là null, nên giá trị mặc định không bao giờ được dùng.
Hãy bọc biểu thức ?? trong cặp ngoặc tròn mỗi khi nó nằm bên trong một biểu thức lớn hơn.
Câu hỏi thường gặp
?? trong PHP nghĩa là gì?
?? là toán tử null coalescing. $a ?? $b trả về $a nếu nó tồn tại và khác null, ngược lại trả về $b. Đây là cách viết tắt của isset($a) ? $a : $b và không gây cảnh báo khi $a hoặc một khóa mảng chưa được định nghĩa.
?? và ?: trong PHP khác nhau thế nào?
?? chỉ dùng giá trị dự phòng khi vế trái là null hoặc chưa được đặt, nên 0 ?? 5 là 0 và '' ?? 'x' là ''. ?: dùng giá trị dự phòng mỗi khi vế trái là falsy, nên 0 ?: 5 là 5. ?: còn cảnh báo khi biến hay khóa chưa được định nghĩa, ?? thì không.
??= trong PHP làm gì?
$a ??= $b gán $b cho $a chỉ khi $a là null hoặc chưa được đặt; nếu không thì giữ nguyên $a. Đây là cách viết tắt của $a = $a ?? $b; và có từ PHP 7.4.
Toán tử nullsafe ?-> trong PHP là gì?
$obj?->method() chỉ gọi phương thức khi $obj khác null; nếu là null, cả chuỗi trả về null thay vì ném lỗi. Kết hợp với ?? để có giá trị mặc định: $user?->getAddress()?->city ?? 'unknown'. Toán tử này có từ PHP 8.0.