Operator ternary adalah if/else yang muat dalam satu ekspresi: condition ? valueIfTrue : valueIfFalse. Operator ini mengembalikan salah satu dari dua nilai, jadi kamu bisa menyimpannya ke variabel, mencetaknya dengan echo, atau memberikannya ke sebuah fungsi.
Ubah $age menjadi 15 dan $items menjadi 3, lalu jalankan lagi. Perhatikan tanda kurung di sekitar ternary pada baris terakhir: tanpa tanda kurung itu, . akan menggabungkan string-nya lebih dulu dan hasilnya tidak seperti yang kamu inginkan.
Ternary di template HTML
Ternary adalah cara yang biasa dipakai untuk memilih class CSS, label, atau atribut di dalam template. Blok ini membaca ?stock= dari URL: jalankan, lalu klik link di tab Halaman, dan script yang sama berjalan lagi dengan nilai yang berbeda.
<?= ... ?> adalah singkatan dari <?php echo ... ?>, yang membuat kondisi satu baris tetap mudah dibaca di dalam markup.
Short ternary ?: (operator Elvis)
Kalau bagian tengahnya dihilangkan, kamu mendapat $a ?: $b: hasilnya $a kalau $a bernilai truthy, kalau tidak, hasilnya $b. Ini praktis untuk nilai default ketika string kosong atau 0 juga harus diganti dengan nilai cadangan.
Nilai falsy adalah false, 0, 0.0, "", "0", [], dan null. Kalau "0" adalah jawaban yang sah di datamu (kolom jumlah, PIN), short ternary akan membuangnya.
?: vs ??
Keduanya mirip, tetapi memeriksa hal yang berbeda. ?: memakai nilai cadangan saat sisi kirinya falsy. ?? memakai nilai cadangan hanya saat sisi kirinya null atau belum diset, dan tidak memberi warning untuk variabel atau key array yang tidak ada.
Pakai ?? untuk "nilainya mungkin tidak ada" (data request, array konfigurasi, key opsional). Pakai ?: untuk "nilainya ada, tetapi mungkin kosong". Halaman operator null coalescing membahas ?? dan ??= secara rinci.
Ternary bertingkat butuh tanda kurung
PHP 7 membaca a ? b : c ? d : e dari kiri ke kanan, berbeda dengan hampir semua bahasa lain, dan hasilnya salah. PHP 8 menolak untuk menebak:
<?php
echo $score > 90 ? "A" : $score > 80 ? "B" : "C";
PHP Fatal error: Unparenthesized `a ? b : c ? d : e` is not supported. Use either `(a ? b : c) ? d : e` or `a ? b : (c ? d : e)` in /home/index.php on line 2
Tambahkan tanda kurung di sekitar ternary bagian dalam, dan kodenya berjalan:
Short ternary adalah pengecualiannya: $a ?: $b ?: $c boleh ditulis tanpa tanda kurung, seperti pada contoh Elvis di atas.
Pakai match(true) kalau ada lebih dari dua cabang
Ternary bertingkat dengan tiga atau empat level sulit dibaca, bahkan dengan tanda kurung. match dengan true sebagai subjeknya memeriksa kondisi dari atas ke bawah dan mengembalikan arm pertama yang cocok:
Pakai ternary untuk dua kemungkinan hasil dalam satu baris, dan beralihlah ke match atau rangkaian if/elseif begitu kamu butuh kemungkinan ketiga.
Pertanyaan yang sering diajukan
Apa itu operator ternary di PHP?
Bentuk singkat dari if/else yang mengembalikan sebuah nilai: $label = $age >= 18 ? 'adult' : 'minor';. Kalau kondisi sebelum ? bernilai true, ekspresi setelah ? yang dipakai, kalau tidak, ekspresi setelah : yang dipakai.
Apa arti ?: di PHP?
$a ?: $b adalah short ternary (disebut juga operator Elvis). Operator ini mengembalikan $a kalau $a bernilai truthy dan $b kalau tidak, jadi '' ?: 'default' menghasilkan 'default'. Sama dengan $a ? $a : $b, tetapi $a hanya dievaluasi sekali.
Bisakah operator ternary dibuat bertingkat di PHP?
Hanya dengan tanda kurung. Sejak PHP 8, $a ? 'x' : $b ? 'y' : 'z' adalah fatal error, jadi tulis $a ? 'x' : ($b ? 'y' : 'z'). Untuk lebih dari dua cabang, match(true) atau rangkaian if/elseif lebih mudah dibaca.
Bisakah ternary dipakai tanpa bagian else?
Tidak, ternary selalu butuh kedua cabangnya. Untuk "pakai nilai ini atau nilai cadangan", tulis $x ?: 'default' atau $x ?? 'default'; untuk melakukan sesuatu hanya saat sebuah kondisi terpenuhi, tulis if biasa atau $condition && doSomething();.