== memeriksa apakah dua nilai sama setelah PHP mengonversinya ke tipe yang sama. === memeriksa bahwa keduanya sama dan bertipe sama. Jadi 1 == "1" bernilai true, sedangkan 1 === "1" bernilai false.
Kebanyakan bug perbandingan berasal dari == yang mengonversi sesuatu di luar dugaanmu. Kebiasaan bawaan yang baik adalah memakai === dan !==, lalu beralih ke == hanya saat kamu tahu kamu memang menginginkan konversinya.
Semua operator perbandingan PHP
| Operator | Nama | Bernilai true saat |
|---|---|---|
$a == $b | Sama dengan | sama setelah type juggling |
$a === $b | Identik | sama dan tipenya sama |
$a != $b, $a <> $b | Tidak sama dengan | tidak sama setelah type juggling |
$a !== $b | Tidak identik | tidak sama, atau tipenya berbeda |
$a < $b, $a > $b | Kurang dari, lebih dari | |
$a <= $b, $a >= $b | Kurang dari atau sama dengan, lebih dari atau sama dengan | |
$a <=> $b | Spaceship | mengembalikan -1, 0, atau 1 |
Tabel perbandingan longgar dan strict
Setiap sel di tabel ini dihitung oleh PHP 8.3. Pindah antara == dan ===, lalu ketuk sebuah sel untuk melihat ekspresinya. Tabel == penuh kejutan di baris untuk null, "", "0", dan []; tabel === hanya berisi diagonalnya.
| $a == $b | true | false | 1 | 0 | -1 | "1" | "0" | "" | null | [] | "php" | "10" | "1e1" |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| 1 | |||||||||||||
| 0 | |||||||||||||
| -1 | |||||||||||||
| "1" | |||||||||||||
| "0" | |||||||||||||
| "" | |||||||||||||
| null | |||||||||||||
| [] | |||||||||||||
| "php" | |||||||||||||
| "10" | |||||||||||||
| "1e1" |
Cara == membandingkan tipe yang berbeda
Aturan yang diikuti PHP 8, diurutkan sesuai seberapa penting dalam praktik:
- Dua string numerik dibandingkan sebagai angka:
"10" == "1e1"dan"1" == "01"sama-samatrue. - Angka dan string numerik: string-nya menjadi angka.
100 == "1e2"bernilaitrue. - Angka dan string non-numerik: sejak PHP 8, angkanya menjadi string dan keduanya dibandingkan sebagai string.
0 == "a"bernilaifalse(di PHP 7 hasilnyatrue). - Apa pun dengan bool: kedua sisi dikonversi menjadi bool.
"a" == truedan[] == falsebernilaitrue. - null dan string:
nullmenjadi"", jadinull == ""bernilaitruetetapinull == "0"bernilaifalse. Terhadap tipe lainnya,nulldibandingkan sebagaifalse. - Dua array: sama kalau keduanya punya pasangan key/value yang sama.
Baris terakhir menunjukkan kenapa perbandingan urutan dengan null jarang masuk akal: null menjadi false, -1 menjadi true, dan false < true.
Tidak sama: != vs !==
!= dan <> adalah operator yang sama. !== adalah versi strict-nya. Perbedaannya paling terasa pada fungsi yang mengembalikan 0 atau false, seperti strpos:
0 != false bernilai false karena 0 dikonversi menjadi false. 0 !== false bernilai true karena int bukan bool. Jebakan yang sama berlaku untuk array_search dan untuk in_array tanpa flag strict-nya.
Membandingkan string
< dan > membandingkan string byte demi byte (urut abjad untuk ASCII biasa). Kalau kedua string numerik, keduanya dibandingkan sebagai angka. Untuk urutan tanpa membedakan huruf besar kecil atau urutan "natural", pakai fungsi-fungsi ini:
Operator spaceship <=>
$a <=> $b mengembalikan -1 saat $a lebih kecil, 0 saat keduanya sama, dan 1 saat $a lebih besar. Operator ini memakai aturan yang sama dengan < dan ==, dan merupakan cara terpendek untuk menulis callback pengurutan.
Membandingkan dua array dengan <=> berarti membandingkannya elemen demi elemen. Begitulah callback tadi mengurutkan berdasarkan usia lebih dulu, lalu nama. Resep pengurutan lainnya ada di halaman mengurutkan array.
Kesalahan umum: membandingkan float dengan ==
Float disimpan dalam bentuk biner, jadi banyak nilai desimal hanyalah perkiraan. 0.1 + 0.2 tidak persis 0.3, dan == melihat perbedaannya.
Untuk uang, simpan dalam satuan sen sebagai integer dan bandingkan dengan ===.
Pertanyaan yang sering diajukan
Apa bedanya == dan === di PHP?
== mengonversi kedua sisi ke tipe yang sama lalu membandingkan, jadi 1 == "1" bernilai true. === bernilai true hanya kalau nilainya sama dan tipenya juga sama, jadi 1 === "1" bernilai false. Pakai === kecuali kamu memang menginginkan konversinya.
Apakah 0 == "a" bernilai true di PHP?
Tidak lagi sejak PHP 8. Saat angka dibandingkan dengan string yang tidak numerik, PHP 8 membandingkan keduanya sebagai string, jadi 0 == "a" bernilai false. Di PHP 7, string itu dikonversi menjadi 0 dan hasilnya true.
Apa bedanya != dan !== di PHP?
!= (dan aliasnya <>) adalah kebalikan ==: hasilnya false saat nilainya sama setelah konversi tipe. !== adalah kebalikan ===: hasilnya true saat nilainya berbeda atau tipenya berbeda, jadi 0 !== false bernilai true sedangkan 0 != false bernilai false.
Bagaimana cara membandingkan dua float di PHP?
Jangan pakai == pada hasil aritmetika float: 0.1 + 0.2 == 0.3 bernilai false. Bandingkan selisihnya dengan toleransi kecil: abs($a - $b) < PHP_FLOAT_EPSILON, atau bulatkan keduanya ke presisi yang kamu perlukan.