BAB 3: STRUKTUR KONTROL

3-1: If, Else, Elseif

Objectives

  • Memahami struktur if-else
  • Menggunakan elseif untuk multiple conditions
  • Memahami nested if dan common mistakes
  • Mengenal operator perbandingan dan logika
  • Mengetahui konsep truthy dan falsy di PHP

Kenapa Butuh Struktur Kontrol?

Program yang baik tidak hanya menjalankan baris demi baris dari atas ke bawah. Kadang kita butuh program untuk mengambil keputusan: "kalau ini benar, lakukan A; kalau tidak, lakukan B". Di sinilah struktur kontrol berperan.

Bayangkan seperti gerbang masuk sebuah gedung:

📊 Memuat diagram…

Dengan if, kita memberi "kartu akses" ke program kita: sebuah kondisi yang menentukan jalur mana yang dieksekusi.

Syntax Dasar If

php
<?php

$umur = 18;

// If basic
if ($umur >= 18) {
    echo "Anda dewasa";
}

// If dengan block
if ($umur >= 18) {
    echo "Anda dewasa";
    echo "Boleh membuat KTP";
}

?>

Struktur if paling sederhana terdiri dari tiga bagian:

BagianContohFungsi
Keyword ififMenandai awal keputusan
Kondisi dalam kurung($umur >= 18)Ekspresi yang dievaluasi
Block { }{ ... }Kode yang dijalankan jika kondisi true
💡Tip

Jika kondisi bernilai true, block di dalam kurung kurawal dieksekusi. Jika false, block tersebut dilewati begitu saja dan program melanjutkan ke baris berikutnya.

If-Else

Terkadang kita ingin melakukan sesuatu juga saat kondisi bernilai false. Di sinilah else digunakan:

php
<?php

$nilai = 70;

if ($nilai >= 75) {
    echo "Lulus";
} else {
    echo "Tidak Lulus";
}

// Output: Lulus

?>

Jika $nilai diganti menjadi 60:

php
<?php

$nilai = 60;

if ($nilai >= 75) {
    echo "Lulus";
} else {
    echo "Tidak Lulus";
}

// Output: Tidak Lulus

?>

if-else menjamin salah satu dari dua jalur pasti dieksekusi — tidak mungkin keduanya, dan tidak mungkin keduanya dilewati.

If-Elseif-Else

Bagaimana kalau keputusannya lebih dari dua jalur? Gunakan elseif:

php
<?php

$score = 85;

if ($score >= 90) {
    echo "Grade A";
} elseif ($score >= 80) {
    echo "Grade B";
} elseif ($score >= 70) {
    echo "Grade C";
} elseif ($score >= 60) {
    echo "Grade D";
} else {
    echo "Grade E";
}

// Output: Grade B

?>
⚠️Perhatian

Urutan kondisi itu penting! PHP mengevaluasi elseif dari atas ke bawah dan berhenti pada kondisi pertama yang true. Jika urutan dibalik (>= 60 dulu baru >= 90), semua nilai akan jatuh ke grade D.

Ilustrasi alur evaluasinya:

📊 Memuat diagram…

Operator Perbandingan

Kondisi dalam if dibangun dari operator perbandingan. Ini yang paling sering dipakai:

OperatorArtiContohHasil
==Sama dengan (loose)5 == "5"true
===Identik (strict)5 === "5"false
!=Tidak sama (loose)5 != "5"false
!==Tidak identik (strict)5 !== "5"true
>Lebih besar10 > 5true
<Lebih kecil10 < 5false
>=Lebih besar atau sama5 >= 5true
<=Lebih kecil atau sama3 <= 2false
php
<?php

$umur = "25";  // string!

// Loose comparison: PHP konversi otomatis
if ($umur == 25) {
    echo "Loose: sama";  // Output: Loose: sama
}

// Strict comparison: tipe data harus sama juga
if ($umur === 25) {
    echo "Strict: sama";
} else {
    echo "Strict: beda";  // Output: Strict: beda (string vs int)
}

?>
💡Tip

Best practice: selalu gunakan === dan !== kecuali kamu punya alasan kuat memakai yang loose. Strict comparison menghindari bug tersembunyi akibat konversi tipe otomatis.

Operator Logika

Untuk menggabungkan beberapa kondisi, gunakan operator logika:

OperatorNamaHasil true ketika
&&ANDKedua kondisi true
||ORSalah satu kondisi true
!NOTKondisi bernilai false
php
<?php

$umur = 22;
$punya_ktp = true;
$blacklist = false;

// AND: kedua kondisi harus benar
if ($umur >= 17 && $punya_ktp) {
    echo "Boleh memilih";  // Output: Boleh memilih
}

// OR: cukup salah satu benar
if ($umur >= 17 || $blacklist) {
    echo "Lolos filter";  // Output: Lolos filter
}

// NOT: membalik nilai boolean
if (!$blacklist) {
    echo "Tidak masuk blacklist";  // Output: Tidak masuk blacklist
}

?>
⚠️Perhatian

&& dan || menggunakan short-circuit evaluation. Artinya, jika hasil sudah bisa ditentukan dari kondisi pertama, kondisi kedua TIDAK dievaluasi. Contoh: false && expensiveFunction() tidak akan pernah memanggil function tersebut.

Truthy dan Falsy

PHP tidak hanya menerima true/false di dalam kondisi — nilai apa pun bisa dipakai. Nilai yang dianggap false dalam konteks boolean disebut falsy:

NilaiBoolean
0false
"" (string kosong)false
"0" (string nol)false
nullfalse
[] (array kosong)false
"hello"true
42true
"0.0"true (string bukan "0")
php
<?php

$jumlah_item = 0;

if ($jumlah_item) {
    echo "Keranjang terisi";
} else {
    echo "Keranjang kosong";  // Output: Keranjang kosong (0 = falsy)
}

$nama = "Budi";

if ($nama) {
    echo "Halo, $nama";  // Output: Halo, Budi (string non-kosong = truthy)
}

?>
💡Tip

Mengecek if ($jumlah_item) lebih ringkas daripada if ($jumlah_item != 0). Tapi hati-hati dengan string "0" — ia juga falsy dan sering mengecoh pemula!

Alternative Syntax

PHP menyediakan alternative syntax untuk if statements (berguna di HTML templates):

php
<?php

$active = true;

if ($active):
    echo "User active";
else:
    echo "User inactive";
endif;

?>

Dalam HTML:

php
<?php if ($is_logged_in): ?>
    <a href="/logout">Logout</a>
<?php else: ?>
    <a href="/login">Login</a>
<?php endif; ?>

Perhatikan: : menggantikan {, dan endif; menggantikan }. Bentuk ini sangat populer di template karena lebih mudah dibaca saat bercampur dengan tag HTML.

Nested If

Kadang keputusan bertingkat: harus memenuhi syarat pertama dulu sebelum memeriksa syarat kedua.

php
<?php

$age = 25;
$has_license = true;
$has_car = true;

if ($age >= 18) {
    if ($has_license) {
        if ($has_car) {
            echo "Boleh driving";
        } else {
            echo "Butuh punya mobil dulu";
        }
    } else {
        echo "Butuh SIM dulu";
    }
} else {
    echo "Belum cukup umur";
}

?>
⚠️Perhatian

Avoid deep nesting! Lebih dari 2-3 level nesting membuat code sulit dibaca. Gunakan early returns atau restructure logic.

Cara memperbaiki nested if yang dalam adalah dengan early return — periksa kondisi negatif duluan dan keluar secepat mungkin:

php
<?php

function boleh_driving(int $age, bool $has_license, bool $has_car): string
{
    if ($age < 18) {
        return "Belum cukup umur";
    }

    if (!$has_license) {
        return "Butuh SIM dulu";
    }

    if (!$has_car) {
        return "Butuh punya mobil dulu";
    }

    return "Boleh driving";
}

echo boleh_driving(25, true, true);   // Output: Boleh driving
echo boleh_driving(16, true, true);   // Output: Belum cukup umur
echo boleh_driving(25, false, true);  // Output: Butuh SIM dulu

?>

Common Mistakes

Mistake 1: Assignment (=) vs Comparison (==)

php
<?php

// ❌ ERROR: Assignment, bukan comparison!
if ($status = "active") {
    echo "Active";  // Selalu executed karena assignment returns value
}

// ✅ BENAR: Comparison
if ($status == "active") {
    echo "Active";
}

// ✅ TERBAIK: Identical comparison
if ($status === "active") {
    echo "Active";
}

?>

Mistake 2: Forgetting Braces for Single Line

php
<?php

$active = true;
$logged_in = false;

// ⚠️ Works tapi BAD practice
if ($active)
    echo "Active";

// ❌ CONFUSING - hanya baris pertama inside if!
if ($logged_in)
    echo "Logged in";
    echo "Show content";  // Ini SELALU executed karena bukan bagian if!

// ✅ ALWAYS use braces
if ($logged_in) {
    echo "Logged in";
    echo "Show content";
}

?>

Mistake 3: Checking Boolean

php
<?php

$is_valid = true;

// ❌ REDUNDANT
if ($is_valid === true) {
    echo "Valid";
}

// ✅ SIMPLER
if ($is_valid) {
    echo "Valid";
}

// ❌ WRONG
if ($is_valid === false) {
    echo "Invalid";
}

// ✅ CORRECT
if (!$is_valid) {
    echo "Invalid";
}

?>

Mistake 4: Elseif vs Else If

php
<?php

$nilai = 80;

// Keduanya valid, tapi penulisannya beda:
// 1. elseif (satu kata) - gaya paling umum
if ($nilai >= 90) {
    echo "A";
} elseif ($nilai >= 75) {
    echo "B";  // Output: B
}

// 2. else if (dua kata, dengan spasi)
if ($nilai >= 90) {
    echo "A";
} else if ($nilai >= 75) {
    echo "B";  // Output: B
}

// ⚠️ Perbedaan teknis: "else if" sebenarnya adalah
// "else" yang berisi "if" baru. Hasilnya sama untuk
// kasus sederhana, tapi "elseif" lebih disukai.

?>

Mistake 5: Membandingkan String dengan Angka

php
<?php

// PHP 8 mengubah perilaku perbandingan string vs angka
$hasil = "10" < 9;

// Di PHP 7:  false ("10" diubah jadi 10)
// Di PHP 8:  false (string numerik dibandingkan sebagai angka)
var_dump($hasil);  // Output: bool(false)

// String non-numerik dibandingkan secara string
var_dump("abc" == 0);  // Output: bool(false) — di PHP 8!
// (Di PHP 7 hasilnya true — ini alasan kenapa strict comparison penting)

?>

Pro Tips

  1. Selalu pakai braces { } meskipun body-nya satu baris — mencegah bug saat kode ditambah nanti.
  2. Hindari kondisi negatif ganda seperti if (!($a > $b)) — tulis if ($a <= $b).
  3. Pisahkan kondisi kompleks ke dalam variable bernama: $bisa_beli = $saldo >= $harga && !$diblokir; lalu if ($bisa_beli).
  4. Gunakan elseif, bukan else if, untuk konsistensi gaya.
  5. Untuk logika yang hanya memilih satu dari dua nilai, pertimbangkan ternary (lihat materi 3-3).

Exercise

  1. Buat grade calculator: A (90+), B (80+), C (70+), D (60+), E (<60)
  2. Validasi login: check username exists AND password correct
  3. Apa output dari:
php
<?php
$x = 5;
if ($x = 10) {  // typo: = instead of ==
    echo "x is 10";
} else {
    echo "x is not 10";
}
?>
  1. Buat program yang menerima variabel $hari (string nama hari bahasa Inggris). Tampilkan "Weekend" jika Sabtu/Minggu, "Weekday" jika Senin-Jumat, dan "Invalid day" jika lainnya.
  2. Refactor nested if berikut menjadi early return style: cek $umur >= 17 (boleh KTP), $punya_akta (butuh akta), $domisili (butuh domisili).

Summary

KonsepPoin Kunci
ifMenjalankan block jika kondisi true
elseJalur alternatif saat kondisi false
elseifKondisi tambahan, dievaluasi berurutan dari atas
Operator== loose, === strict, && AND, || OR, ! NOT
Truthy/Falsy0, "", "0", null, [] dianggap false
Nested ifHindari > 2-3 level, pakai early return
Best practiceSelalu braces, selalu ===, hindari assignment di kondisi

Klik tombol ini setelah menyelesaikan materi

📝

Quiz Bab 3

Uji pemahamanmu tentang Struktur Kontrol