Pipeline normalisasi pada Chapter Text Normalization berjalan lurus dari baris pertama sampai baris terakhir: setiap pernyataan dieksekusi tepat satu kali tanpa kecuali. Program yang sesungguhnya jarang sepatuh itu — aplikasi perlu memilih jalan: jika stok habis, tampilkan pemberitahuan; jika saldo tidak cukup, tolak transaksi; jika suhu tubuh di atas normal, sarankan istirahat. Struktur if-else adalah alat PHP untuk bercabang sekaligus fondasi seluruh control flow yang akan kita pelajari di Section ini. Pada Chapter pertama ini kita akan membedah sintaksnya, aturan penilaian kondisi (truthiness), pemakaian operator perbandingan, dan pola guard clause yang menjaga kode tetap ramping.

Sintaks if dan else #

Bentuk dasarnya terdiri dari keyword if, kondisi di dalam tanda kurung, dan blok pernyataan di dalam kurung kurawal. Keyword else menambahkan cabang kedua yang dijalankan ketika kondisi tidak terpenuhi:

php
<?php
$suhu = 39;

if ($suhu > 37) {
    echo "Suhu tinggi, segera istirahat\n";
} else {
    echo "Suhu normal\n";
}

Output yang Dihasilkan:

text
Suhu tinggi, segera istirahat

Interpreter membaca nilai $suhu (39), membandingkannya dengan 37 memakai operator lebih besar dari, dan mendapat hasil true. Blok di bawah if dieksekusi, sedangkan blok di bawah else dilewati sepenuhnya — barisnya tidak pernah tersentuh pada eksekusi ini. Begitu nilai $suhu diganti 36, peran keduanya bertukar. Kemampuan melompati baris inilah yang membedakan program hidup dari daftar perintah statis. Blok else sifatnya opsional; if tunggal tanpa else sah saja ketika tidak ada tindakan khusus untuk kondisi yang gagal.

Aturan Truthiness dalam Kondisi #

Kondisi di dalam tanda kurung tidak harus berupa perbandingan. PHP mengevaluasi ekspresi apa pun menjadi boolean — perilaku type juggling yang telah dibahas pada Section Tipe Data dan Type System. Nilai yang dianggap false disebut falsy, dan seluruh sisanya truthy:

NilaiHasil evaluasi
false, nullfalse
0, 0.0false
"" (string kosong)false
"0" (string berisi nol)false
[] (array kosong)false
" ", "00", "false", -1, 0.5true
setiap nilai laintrue
php
<?php
var_dump((bool) "", (bool) "0", (bool) "00");
var_dump((bool) " ", (bool) 0.0, (bool) "false");

Output yang Dihasilkan:

text
bool(false)
bool(false)
bool(true)
bool(true)
bool(false)
bool(true)

Tiga kejutan tersimpan pada keluaran di atas. String "0" bernilai false padahal "00" bernilai true; string " " yang hanya berisi satu spasi bernilai true karena memang tidak kosong; dan string "false" bernilai true karena kebenaran string ditentukan oleh isinya yang tidak kosong, bukan makna katanya. Aturan-aturan ini langsung terpakai pada pemeriksaan input:

php
<?php
$nama = "";

if ($nama) {
    echo "Halo, $nama\n";
} else {
    echo "Nama masih kosong\n";
}

Output yang Dihasilkan:

text
Nama masih kosong

String kosong dievaluasi menjadi false, sehingga cabang else yang berjalan. Bentuk if ($nama) adalah idiom ringkas untuk “jika terisi”. Bila domain data Anda menganggap nilai "0" sah sebagai isian — misalnya kolom nomor rumah — gunakan pemeriksaan eksplisit if ($nama !== "") agar string "0" tidak ikut dianggap kosong.

Perbandingan dalam Kondisi #

Kondisi yang paling sering kita tulis tetap berupa perbandingan, dan pilihan antara === dengan == menentukan hasilnya. Data dari formulir HTML selalu datang sebagai string, sehingga pertemuannya dengan angka adalah kasus klasik:

php
<?php
$poin = "95";

if ($poin === 95) {
    echo "Tipe sama, nilai sama\n";
} else {
    echo "Tipe berbeda\n";
}

if ($poin == 95) {
    echo "Nilai dianggap sama\n";
}

Output yang Dihasilkan:

text
Tipe berbeda
Nilai dianggap sama

Operator === menuntut tipe dan nilai sama persis; string "95" dan integer 95 gagal, sehingga cabang Tipe berbeda yang tampil. Operator == melakukan koersi terlebih dahulu — "95" dikenali sebagai string numerik dan dibandingkan sebagai angka — sehingga kondisi keduanya terpenuhi. Kondisi juga sering dirangkai dengan operator logika:

php
<?php
$umur = 20;
$punyaKtp = true;

if ($umur >= 17 && $punyaKtp) {
    echo "Boleh mendaftar\n";
} else {
    echo "Syarat belum terpenuhi\n";
}

Output yang Dihasilkan:

text
Boleh mendaftar

Operator && hanya menghasilkan true bila kedua syarat terpenuhi, sedangkan || cukup dengan salah satu. Kombinasi perbandingan dan logika inilah yang membentuk hampir semua kondisi pada aplikasi nyata, dari validasi formulir sampai pemeriksaan hak akses.

Early Return dan Guard Clause #

Contoh-contoh sejauh ini berdiri di tingkat atas skrip. Dalam praktiknya, keputusan paling sering hidup di dalam fungsi — kita telah rajin memanggil fungsi bawaan, dan kali ini kita mendefinisikan fungsi sendiri dalam bentuk paling sederhana: keyword function, nama, parameter bertipe, dan nilai balik. Tanda ?string pada nilai balik berarti fungsi boleh mengembalikan string atau null; pembahasan fungsi yang tuntas menanti di Section Fungsi. Perhatikan dulu versi yang menumpuk kondisi bersarang:

php
<?php
function validasiNamaBersarang(string $nama): ?string
{
    if ($nama !== "") {
        if (mb_strlen($nama) <= 20) {
            return null;
        } else {
            return "Nama maksimal 20 karakter";
        }
    } else {
        return "Nama tidak boleh kosong";
    }
}

Versi tersebut benar, tetapi hasil yang diinginkan — null sebagai tanda lolos validasi — terkubur di kedalaman dua lapis sarang. Setiap syarat baru yang ditambahkan akan menggali satu lapis lagi. Bandingkan dengan versi guard clause:

php
<?php
function validasiNama(string $nama): ?string
{
    if ($nama === "") {
        return "Nama tidak boleh kosong";
    }
    if (mb_strlen($nama) > 20) {
        return "Nama maksimal 20 karakter";
    }
    return null;
}

echo validasiNama("") . "\n";
echo var_export(validasiNama("Budi Santoso"), true) . "\n";

Output yang Dihasilkan:

text
Nama tidak boleh kosong
NULL

Dua guard clause berdiri di baris awal fungsi: syarat penolak diperiksa satu per satu, dan return segera keluar begitu satu syarat gagal. Baris return null di bawahnya hanya tercapai bila semua pemeriksaan lolos — jalan bahagia yang rata tanpa sarang. Pemanggilan validasiNama("") mengembalikan pesan error karena string kosong ditolak penjaga pertama, sedangkan validasiNama("Budi Santoso") menembus keduanya dan mengembalikan null yang ditampilkan var_export() sebagai NULL. Fungsi mb_strlen() sendiri kita kenal dari Chapter String Length dan Encoding karena nama bisa memuat huruf beraksen. Teknik keluar lebih awal ini disebut early return, dan pasangannya — kondisi penolak di puncak fungsi — adalah guard clause.

Blok Tanpa Kurung Kurawal #

PHP mengizinkan if dan else mengikat tepat satu pernyataan tanpa kurung kurawal:

php
<?php
$stok = 0;

if ($stok === 0)
    echo "Stok habis\n";
else
    echo "Stok tersedia\n";

Output yang Dihasilkan:

text
Stok habis

Kode di atas berjalan benar karena setiap cabang hanya berisi satu echo. Kerapuhannya muncul saat kode berkembang: menambahkan baris kedua di bawah echo tanpa menambahkan kurung kurawal akan membuat baris baru tersebut dieksekusi di luar cabang — selalu berjalan apa pun kondisinya.

Ringkasan #

Struktur if-else mengevaluasi kondisi menjadi boolean lalu memilih satu cabang: daftar nilai falsy seperti "", "0", dan null menentukan kapan kondisi dianggap gagal, operator === menjaga perbandingan dari koersi yang mengejutkan, dan guard clause dengan early return meratakan fungsi yang seharusnya bersarang dalam. Satu cabang benar dan satu cabang salah, namun, belum cukup untuk keputusan berjenjang seperti grade nilai atau diskong berlapis. Chapter berikutnya memperkenalkan elseif untuk merangkai banyak kondisi dalam satu kesatuan keputusan.

Referensi #