Program sering kali harus mengambil keputusan: apakah stok menipis, apakah saldo cukup, apakah kata sandi cocok. Operator perbandingan adalah alat PHP untuk menguji hubungan antara dua nilai dan menghasilkan jawaban true atau false. Pada chapter ini kita akan mempelajari operator-operator perbandingan inti PHP, lalu membedah perilakunya yang paling sering mengejutkan: perbandingan longgar (==) yang mengubah tipe data secara diam-diam, termasuk aturan barunya di PHP 8.
Daftar Operator Perbandingan #
Tabel berikut merangkum operator perbandingan PHP. Semuanya mengembalikan nilai boolean (true atau false), siap dipakai sebagai kondisi pada if yang akan kita pelajari di Section Control Flow.
| Operator | Nama | Contoh | Hasil |
|---|---|---|---|
== | Sama dengan (longgar) | 5 == "5" | true |
!= | Tidak sama dengan | 5 != 3 | true |
<> | Tidak sama dengan (alias !=) | 5 <> 3 | true |
< | Lebih kecil | 3 < 5 | true |
> | Lebih besar | 3 > 5 | false |
<= | Lebih kecil atau sama | 5 <= 5 | true |
>= | Lebih besar atau sama | 3 >= 5 | false |
Mari kita lihat seluruh operator tersebut bekerja pada pasangan angka nyata:
<?php
$harga = 15000;
$anggaran = 20000;
var_dump($harga < $anggaran); // 15000 < 20000
var_dump($harga > $anggaran); // 15000 > 20000
var_dump($harga <= 15000); // sama persis -> tetap true
var_dump($harga >= 20000);
var_dump($harga == 15000);
var_dump($harga != $anggaran);
var_dump($anggaran <> 20000); // <> alias !=, hasil sama
Output yang Dihasilkan:
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
bool(true)
bool(false)Operator != dan <> benar-benar identik — keduanya ada karena <> dipertahankan untuk kompatibilitas dengan gaya bahasa lain seperti Pascal. Pilih satu dan gunakan secara konsisten; komunitas PHP umumnya memilih !=.
Perbandingan Longgar #
Operator == disebut perbandingan longgar karena PHP mengonversi tipe data kedua operan lebih dahulu agar sebanding, sebelum membandingkan nilainya. Mekanisme ini bernama type juggling dan sudah kita kenali di chapter Type Juggling
. Konsekuensinya, nilai dengan tipe berbeda bisa dianggap sama:
<?php
var_dump("5" == 5); // string numerik vs angka
var_dump(null == false);
var_dump("" == null);
var_dump(false == 0);Output yang Dihasilkan:
bool(true)
bool(true)
bool(true)
bool(true)Nilai null dibandingkan dengan false menghasilkan true karena keduanya dikonversi ke boolean dan sama-sama “kosong”. Demikian pula string kosong "" dianggap sama dengan null, dan false dianggap sama dengan 0. Tabel berikut merangkum kasus-kasus yang paling sering muncul beserta hasilnya pada PHP 8 — semuanya sudah diuji ulang:
| Ekspresi | Hasil | Alasan |
|---|---|---|
"5" == 5 | true | "5" string numerik → dibandingkan sebagai angka |
"1e2" == 100 | true | "1e2" string numerik (notasi ilmiah) → 100 |
"1" == "01" | true | dua string numerik → dibandingkan sebagai angka 1 == 1 |
null == false | true | keduanya bernilai “kosong” saat dikonversi ke boolean |
"" == null | true | string kosong dan null setara secara longgar |
"abc" == 0 | false | "abc" bukan string numerik (aturan PHP 8) |
0 == "" | false | "" bukan string numerik (aturan PHP 8) |
0 == " " | false | " " (spasi) bukan string numerik |
Aturan PHP 8 untuk kasus angka vs string cukup sederhana untuk diingat. Jika string tersebut adalah numeric string (hanya berisi angka, seperti "5", "1e2", atau " -3.5 " dengan spasi di luarnya), perbandingan dilakukan secara angka. Jika string bukan numeric string, angkanya yang justru dikonversi menjadi string sehingga perbandingan dilakukan sebagai teks. Inilah mengapa "abc" == 0 bernilai false: PHP membandingkan teks "abc" dengan teks "0", dan keduanya memang berbeda.
Membandingkan String #
Dua string dibandingkan karakter demi karakter menurut urutan byte — sama seperti urutan alfabet, dengan catatan huruf kapital selalu “lebih kecil” daripada huruf kecil ("A" adalah byte 65, "a" adalah byte 97). Namun ada pengecualian penting: jika kedua string sama-sama numeric string, PHP membandingkannya sebagai angka:
<?php
var_dump("apel" < "pisang"); // alfabetis: a < p
var_dump("pisang" < "apel");
var_dump("A" < "a"); // kapital lebih kecil dari huruf kecil
var_dump("10" < "9"); // keduanya string numerik -> dibandingkan sbg angka
var_dump(10 < "9"); // angka vs string numerik -> 10 < 9
Output yang Dihasilkan:
bool(true)
bool(false)
bool(true)
bool(false)
bool(false)Baris "10" < "9" sering mengejutkan: intuisi urutan teks berkata hasilnya true karena karakter '1' lebih awal daripada karakter '9'. Namun karena "10" dan "9" sama-sama numeric string, PHP membandingkannya sebagai angka, dan 10 < 9 bernilai false. Aturan “numerical or lexical” ini bukan hal baru di PHP 8 — perbandingan string lawan string sudah lama bersifat pintar begitu. Jika Anda memang butuh perbandingan teks murni (misalnya mengurutkan nomor halaman "10" sebelum "9" secara leksikal), gunakan fungsi strcmp() yang selalu membandingkan karakter demi karakter.
Perbandingan dalam Praktik #
Data dari luar program — formulir web, berkas konfigurasi, baris CSV — hampir selalu datang sebagai string. Perbandingan longgar membuat pemeriksaan seperti ini nyaman dilakukan tanpa konversi manual:
<?php
// Anggap kedua nilai ini berasal dari formulir web (selalu string)
$hargaInput = "5000";
$stokInput = "3";
var_dump($hargaInput == 5000); // string numerik vs angka -> true
var_dump($stokInput == "3"); // string vs string -> true
var_dump($stokInput == 3); // string numerik vs angka -> true
var_dump($hargaInput > 4500); // perbandingan angka 5000 > 4500
Output yang Dihasilkan:
bool(true)
bool(true)
bool(true)
bool(true)Kenyamanan ini ada harganya: perbandingan longgar bisa memberi true pada nilai yang menurut manusia tidak “sama”. Bayangkan fungsi pencarian yang membandingkan ID member — jika satu sisi bernilai 0 dan sisi lain string "kosong", PHP 7 akan menganggapnya sama persis. PHP 8 sudah menutup sebagian besar jebakan ini, tetapi cara paling aman tetap menggunakan perbandingan ketat === yang memeriksa tipe data terlebih dahulu — topik chapter berikutnya.
Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh chapter ini dalam satu program yang bisa dijalankan langsung.
Referensi #
- Operator Perbandingan — Manual PHP
- Aturan String Numerik — Manual PHP
- Perubahan Tidak Kompatibel PHP 8.0 — Manual PHP
Ringkasan #
Operator perbandingan ==, !=/<>, <, >, <=, >= menghasilkan boolean dan menjadi bahan bakar pengambilan keputusan. Perbandingan longgar == melakukan type juggling: numeric string dibandingkan sebagai angka, sementara string non-numerik dibandingkan sebagai teks — aturan PHP 8 yang membuat "abc" == 0 bernilai false. Jika tipe data kedua nilai harus benar-benar cocok, kita membutuhkan operator identitas ===, yang menjadi fokus chapter berikutnya.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
// contoh.php — rangkuman Operator Perbandingan
// Jalankan dengan: php contoh.php
echo "== Enam operator dasar ==\n";
$harga = 15000;
$anggaran = 20000;
var_dump($harga < $anggaran);
var_dump($harga > $anggaran);
var_dump($harga <= 15000);
var_dump($harga >= 20000);
var_dump($harga == 15000);
var_dump($harga != $anggaran);
var_dump($anggaran <> 20000); // <> alias !=
echo "\n== Perbandingan longgar ==\n";
var_dump("5" == 5);
var_dump("1e2" == 100);
var_dump("1" == "01");
var_dump(null == false);
var_dump("" == null);
var_dump("abc" == 0);
var_dump(0 == "");
var_dump(0 == " ");
echo "\n== Membandingkan string ==\n";
var_dump("apel" < "pisang");
var_dump("pisang" < "apel");
var_dump("A" < "a");
var_dump("10" < "9"); // PHP 8: numeric string -> dibandingkan sbg angka
var_dump(10 < "9");
echo "\n== Input dari luar biasanya string ==\n";
$hargaInput = "5000";
$stokInput = "3";
var_dump($hargaInput == 5000);
var_dump($stokInput == "3");
var_dump($stokInput == 3);
var_dump($hargaInput > 4500);