?? mengembalikan nilai di sebelah kirinya jika ada dan tidak bernilai null, jika tidak nilai di sebelah kanannya: $name = $_GET['name'] ?? 'Guest';. Tidak seperti membaca key secara langsung, operator ini tidak pernah memberi warning saat variabel atau key array-nya tidak ada.
Pada run pertama tidak ada query string, jadi kedua nilai default yang dipakai. Klik sebuah link di tab Halaman, maka script berjalan lagi dengan $_GET yang sudah terisi. Membaca $_GET["name"] tanpa ?? pada run pertama itu akan mencetak Warning: Undefined array key "name" pada pengaturan PHP yang normal. Penjelasan lebih lanjut tentang data request ada di halaman _POST.
?? adalah pemeriksaan isset() yang singkat
$a ?? $b berarti persis isset($a) ? $a : $b. Operator ini bekerja pada variabel, key array di kedalaman berapa pun, dan property object, serta berhenti di bagian pertama yang tidak ada tanpa mengeluh.
Pemeriksaannya sama dengan yang dilakukan isset, jadi key yang ada dengan nilai null juga memakai nilai default.
Merangkai ?? untuk mencoba beberapa sumber
?? bersifat asosiatif kanan dan kamu bisa merangkainya sebanyak yang kamu mau. PHP mengembalikan operand pertama yang sudah diisi dan tidak bernilai null.
??= hanya mengisi saat null
$a ??= $b menyimpan $b ke $a hanya saat $a belum diisi atau bernilai null. Ini cara paling singkat untuk mengisi nilai default atau menghitung sesuatu sekali lalu memakainya lagi.
Sisi kanan ??= hanya dievaluasi saat assignment terjadi, itulah sebabnya computing 4 hanya muncul sekali.
?? vs ?: (ternary singkat)
?? menguji null. ?: menguji truthiness. Dengan nilai seperti 0, "", dan "0", keduanya memberi jawaban yang berbeda:
Jumlah "0" adalah input yang sungguhan: ?? mempertahankannya, ?: menggantinya. ?: saja akan memberi warning tentang key yang tidak ada, itulah sebabnya blok ini membungkusnya sebagai ($inputs[$key] ?? null) ?: .... Halaman operator ternary membahas ?: itu sendiri.
Operator nullsafe ?->
?-> adalah versi object dari ide yang sama, ditambahkan di PHP 8. Jika object di sebelah kiri bernilai null, seluruh rantai berhenti dan mengembalikan null alih-alih melempar Error seperti Call to a member function getAddress() on null. Taruh ?? di akhir untuk nilai default.
User 2 ada tetapi tidak punya alamat, dan user 3 sama sekali tidak ada. Keduanya sampai ke nilai default ?? "unknown" tanpa error.
Kesalahan umum: ?? punya prioritas rendah
?? mengikat lebih longgar daripada . dan operator aritmetika. Jadi di "Count: " . $count ?? 0, PHP lebih dulu menyusun string "Count: " . $count, yang tidak pernah bernilai null, sehingga nilai default-nya tidak pernah dipakai.
Bungkus ekspresi ?? dengan tanda kurung setiap kali ia berada di dalam ekspresi yang lebih besar.
Pertanyaan yang sering diajukan
Apa arti ?? di PHP?
?? adalah operator null coalescing. $a ?? $b mengembalikan $a jika ada dan tidak bernilai null, jika tidak $b. Operator ini singkatan dari isset($a) ? $a : $b dan tidak memunculkan warning saat $a atau sebuah key array tidak terdefinisi.
Apa perbedaan ?? dan ?: di PHP?
?? memakai nilai cadangan hanya saat sisi kirinya null atau belum diisi, jadi 0 ?? 5 menghasilkan 0 dan '' ?? 'x' menghasilkan ''. ?: memakai nilai cadangan setiap kali sisi kirinya falsy, jadi 0 ?: 5 menghasilkan 5. ?: juga memberi warning tentang variabel dan key yang tidak terdefinisi, ?? tidak.
Apa fungsi ??= di PHP?
$a ??= $b mengisi $a dengan $b hanya jika $a bernilai null atau belum diisi; jika tidak, $a dibiarkan apa adanya. Operator ini singkatan dari $a = $a ?? $b; dan ditambahkan di PHP 7.4.
Apa itu operator nullsafe ?-> di PHP?
$obj?->method() memanggil method hanya saat $obj tidak bernilai null; jika null, seluruh rantai mengembalikan null alih-alih melempar error. Gabungkan dengan ?? untuk nilai default: $user?->getAddress()?->city ?? 'unknown'. Operator ini ditambahkan di PHP 8.0.