Kontrol alur adalah cara kode memilih jalan: baris mana yang dijalankan tergantung keadaannya. Bayangin Bu Tini di kasir Warung Bu Tini. Dia melihat total belanja pembeli lalu memutuskan: kalau Rp100.000 ke atas, gratis ongkir; kalau gak, kalau Rp50.000 ke atas, diskon 10%; kalau gak juga, harga normal. Dia mengecek dari atas, dan berhenti di aturan pertama yang cocok. Itu persis cara kerja if.
🧪 Tebakan cepat: Total belanjanya Rp120.000. Kodenya mengecek
$total >= 25000lebih dulu, baru$total >= 50000, lalu$total >= 100000. Label mana yang tercetak? Tebak dulu, jawabannya ada di bagian "Urutan kondisi menentukan hasil".
if, elseif, else: dicek dari atas
<?php
$total = 60000;
if ($total >= 100000) {
echo "Gratis ongkir";
} elseif ($total >= 50000) {
echo "Diskon 10%";
} elseif ($total >= 25000) {
echo "Bonus kerupuk";
} else {
echo "Harga normal";
}
Ini yang dikerjakan PHP untuk $total = 60000:
| Kondisi | Hasil | Yang terjadi |
|---|---|---|
$total >= 100000 |
false |
lewat, cek berikutnya |
$total >= 50000 |
true |
cetak Diskon 10%, selesai |
$total >= 25000 |
gak dicek | dilewati |
else |
gak dicek | dilewati |
if (kondisi) { ... }: kondisi adalah ekspresi yang hasilnyatrueataufalse. Kalautrue, isi kurung kurawalnya jalan.elseifcuma dicek kalau semua kondisi di atasnyafalse. Boleh juga dituliselse if.elsegak punya kondisi. Dia jalan kalau gak ada satu pun yangtrue.- Paling banyak satu cabang yang jalan. Begitu satu cabang jalan, sisanya dilewati.
Operator perbandingan yang sering dipakai: >= (lebih besar atau sama dengan), >, <=, <, === (sama persis: nilai dan tipenya) dan !== (gak sama persis). Dua syarat bisa digabung dengan && (dan) atau || (atau), dan ! membalik true jadi false.
Total tepat Rp50.000 dapat Diskon 10%, karena 50000 >= 50000 bernilai true. Nilai yang pas di batas ikut tingkat itu.
Urutan kondisi menentukan hasil
<?php
$total = 120000;
if ($total >= 25000) {
echo "Bonus kerupuk";
} elseif ($total >= 50000) {
echo "Diskon 10%";
} elseif ($total >= 100000) {
echo "Gratis ongkir";
}
// Output: Bonus kerupuk
120000 >= 25000 sudah true di cek pertama, jadi yang tercetak Bonus kerupuk, dan dua kondisi di bawahnya gak pernah dicek. Itu jawaban tebakannya. Aturannya: kalau pakai >=, mulai dari batas paling tinggi lalu turun.
Batasnya juga harus pas. Kalau >= 50000 ditulis > 50000, total tepat Rp50.000 gak lolos dan turun ke Bonus kerupuk.
Nilai yang dianggap false
Kondisi gak harus perbandingan. if ($jumlah) juga boleh: PHP mengubah nilainya jadi true atau false dulu. Yang dianggap false (falsy) cuma ini: false, 0, 0.0, "" (string kosong), "0", null, dan [] (array kosong). Semua yang lain true (truthy), termasuk "0.0", " ", "false" dan -1.
<?php
$jumlah = 0;
echo $jumlah ? "Ada pesanan" : "Belum ada pesanan"; // Belum ada pesanan
$kode = "0";
if ($kode) {
echo "true";
} else {
echo "false"; // ini yang jalan: "0" dianggap false
}
kondisi ? A : B disebut ternary: if-else pendek yang menghasilkan nilai. Kalau kondisinya true hasilnya A, kalau false hasilnya B.
match: satu nilai, banyak pilihan
<?php
$status = "dimasak";
echo match ($status) {
"baru" => "Pesanan diterima",
"dimasak" => "Sedang dimasak",
"siap" => "Siap diantar",
default => "Status tidak dikenal",
};
// Output: Sedang dimasak
matchmembandingkan$statusdengan tiap nilai di kiri=>memakai===: nilai dan tipenya harus sama.$meja = "1"(dari form, selalu string) gak cocok dengan1 =>, cuma dengan"1" =>.- Hasil
matchadalah nilai, jadi bisa langsung di-echoatau disimpan di variabel. Tutup dengan;setelah}. defaultdipakai kalau gak ada yang cocok. Tanpadefault, nilai yang gak tercantum menghentikan script:
Fatal error: Uncaught UnhandledMatchError: Unhandled match case 'diantar' in /app/warung.php:4
Untuk rentang nilai, tulis match (true): tiap kondisi di kiri dihitung, dan yang pertama bernilai true menang.
$label = match (true) {
$total >= 100000 => "Gratis ongkir",
$total >= 50000 => "Diskon 10%",
default => "Harga normal",
};
switch: versi lama dengan break
<?php
$hari = "Jumat";
switch ($hari) {
case "Senin":
echo "Belanja ke pasar";
break;
case "Jumat":
echo "Menu spesial: Nasi Kebuli";
break;
default:
echo "Menu biasa";
}
- Tiap
casemenulis satu nilai yang dibandingkan.breakkeluar dariswitch. Tanpabreak, PHP jalan terus kecasedi bawahnya (fall-through). switchmembandingkan dengan==(longgar):"1"dan1dianggap sama,"01"dan1juga.matchgak begitu. Untuk kode baru,matchbiasanya lebih aman.
Kalau nilainya null: ??
<?php
$pesanan = ["menu" => "Es Teh"];
echo $pesanan["catatan"] ?? "tanpa catatan"; // tanpa catatan
a ?? b artinya: pakai a kalau ada dan bukan null, kalau gak, pakai b. Tanpa ??, membaca key yang gak ada memunculkan Warning: Undefined array key "catatan". Ingat, ?? cuma mengganti yang null atau gak ada: catatan berisi "" tetap dicetak kosong.
Nanti di pelajaran OOP kamu ketemu object. Saudaranya, ?->, membaca isi object yang mungkin null: $pelanggan?->nama ?? "Tamu" menghasilkan "Tamu" kalau $pelanggan null, bukan Warning: Attempt to read property "nama" on null.
⚠️ Jebakan yang sering ketemu
- Urutan kondisi terbalik. Batas terkecil dicek duluan, jadi semua nilai besar ikut masuk ke situ. Dengan
>=, urutkan dari yang tertinggi. >padahal maksudnya>=. Nilai yang pas di batas (Rp50.000, atau skor 70 di latihan) jatuh ke tingkat di bawahnya.=di dalamif.if ($total = 0)mengisi$totaldengan 0, bukan membandingkan, jadi hasilnya selalufalsedan totalnya hilang. Bandingkan dengan===.matchtanpadefault. Nilai yang gak tercantum memunculkanUnhandledMatchErrordan script berhenti.
TL;DR: if/elseif/else dicek dari atas dan cuma cabang pertama yang true yang jalan, jadi urutkan batas >= dari yang tertinggi dan pakai >= supaya nilai di batas ikut. Yang dianggap false: false, 0, 0.0, "", "0", null, []. kondisi ? A : B adalah if-else pendek. match membandingkan dengan === dan menghasilkan nilai; tanpa default, nilai yang gak cocok bikin UnhandledMatchError. switch membandingkan dengan ==, tiap case butuh break. a ?? b memakai b kalau a null atau gak ada.