Satu perbandingan saja sering tidak cukup untuk mengambil keputusan: pesanan boleh diproses kalau stok tersedia dan pembeli sudah membayar; tampilkan peringatan kalau kuota hampir penuh atau ada antrian tertunda. Operator logika menggabungkan beberapa nilai boolean menjadi satu kesimpulan. Pada chapter ini kita akan mempelajari keenam operator logika PHP, perilaku short-circuit yang membuatnya efisien, dan jebakan precedence klasik antara && dengan and yang telah menjebak banyak programmer.

Daftar Operator Logika #

PHP menyediakan dua keluarga operator logika: versi simbol (&&, ||, !) dan versi kata (and, or, xor). Keduanya menghasilkan boolean dan menerima operan yang bisa dinilai benar-salah:

OperatorNamaContohHasil
&&ANDtrue && falsefalse
||ORtrue || falsetrue
!NOT (negasi)!truefalse
andAND (precedence rendah)true and falsefalse
orOR (precedence rendah)true or falsetrue
xorXOR (tepat satu benar)true xor falsetrue

Operator && menghasilkan true hanya jika kedua operan benar; || cukup satu operan benar; xor (exclusive or) menghasilkan true hanya jika tepat satu operan benar — dua-duanya benar justru menghasilkan false. Mari kita lihat semuanya bekerja:

php
<?php
var_dump(true && true, true && false, false && true, false && false);
var_dump(true || true, true || false, false || false);
var_dump(true xor true, true xor false, false xor true, false xor false);
var_dump(!true, !false, !(5 > 3), !(5 < 3));

Output yang Dihasilkan:

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

Empat baris pertama adalah tabel kebenaran &&: hasilnya true hanya pada kasus true && true. Baris || menunjukkan hasilnya false hanya ketika kedua operan salah. Baris xor menegaskan makna “tepat satu”: true xor true bernilai false. Baris terakhir memperlihatkan negasi ! yang membalik boolean — perhatikan bahwa !(5 > 3) meniadakan hasil perbandingan 5 > 3 yang bernilai true, sehingga hasil akhirnya false.

Menggabungkan Kondisi Nyata #

Dalam program sungguhan, operan operator logika hampir selalu berupa hasil perbandingan atau nilai boolean dari proses sebelumnya. Berikut contoh keputusan bisnis yang memakai tiga kondisi sekaligus:

php
<?php
$stok = 3;
$harga = 50000;
$isMember = true;

var_dump($stok > 0 && $harga >= 50000);
var_dump($stok > 0 || $harga < 10000);
var_dump(!$isMember);
var_dump($isMember && $stok > 0 && $harga >= 50000);

Output yang Dihasilkan:

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

Baris pertama menggabungkan dua perbandingan dengan &&: stok tersedia dan harga mencapai ambang — keduanya benar, hasilnya true. Baris kedua memakai ||, cukup salah satu kondisi benar. Baris ketiga menegaskan negasi: $isMember bernilai true, jadi !$isMember bernilai false. Baris keempat menunjukkan bahwa operator yang sama bisa dirangkai panjang: PHP mengevaluasi $isMember && $stok > 0 && $harga >= 50000 dari kiri ke kanan dan menghasilkan true karena semuanya benar.

Evaluasi Short-Circuit #

Operator && dan || tidak selalu mengevaluasi kedua operannya. Jika operan kiri && sudah bernilai salah, hasilnya pasti false apa pun operan kanannya — PHP langsung berhenti dan tidak menyentuh operan kanan sama sekali. Kebalikannya, jika operan kiri || sudah bernilai benar, hasilnya pasti true. Perilaku ini bernama short-circuit dan paling mudah dibuktikan dengan function yang meninggalkan jejak saat dipanggil:

php
<?php
function kerjaBerat(): bool {
    echo "kerjaBerat() dipanggil\n";
    return true;
}

$hasil = false && kerjaBerat();
var_dump($hasil);

$hasil = true || kerjaBerat();
var_dump($hasil);

$hasil = true && kerjaBerat();
var_dump($hasil);

Output yang Dihasilkan:

text
bool(false)
bool(true)
kerjaBerat() dipanggil
bool(true)

Pada dua pemanggilan pertama, teks kerjaBerat() dipanggil tidak pernah muncul: operan kiri sudah cukup menentukan hasil sehingga function di operan kanan tidak dieksekusi sama sekali. Pemanggilan ketiga menampilkan teks tersebut karena operan kiri true belum cukup menyimpulkan hasil &&, sehingga operan kanan harus dievaluasi. Implikasinya besar: letakkan pemeriksaan yang murah atau yang berpotensi gagal di sisi kiri. Perilaku ini berpadu erat dengan konsep truthiness — bagaimana PHP menilai benar-salah untuk nilai non-boolean — yang kita bedah tuntas di chapter Truthiness dan Short-Circuit .

Jebakan Precedence: && vs and #

Inilah jebakan paling terkenal pada operator logika PHP: && dan and menghasilkan nilai yang sama, tetapi memiliki precedence (urutan kekuatan evaluasi) yang berbeda terhadap operator assignment =. Operator && lebih kuat dari =, sedangkan and lebih lemah dari =. Akibatnya, dua baris yang terlihat hampir identik berikut menghasilkan nilai variabel yang berbeda:

php
<?php
$a = true && false;  // dievaluasi: $a = (true && false)
$b = true and false; // dievaluasi: ($b = true) and false

var_dump($a, $b);

$c = false || true;  // dievaluasi: $c = (false || true)
$d = false or true;  // dievaluasi: ($d = false) or true

var_dump($c, $d);

Output yang Dihasilkan:

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

Pada baris $a = true && false, PHP menghitung true && false lebih dahulu (hasilnya false) lalu menyimpannya ke $a. Pada baris $b = true and false, kekuatan = justru lebih tinggi: PHP menyimpan true ke $b lebih dahulu, barulah hasil penugasan itu di-AND-kan dengan false — dan hasil operasi terakhir ini tidak tersimpan ke mana-mana. Itulah mengapa $b berisi true. Pola yang sama terjadi pada $d: nilainya false karena or baru bekerja setelah penugasan selesai.

Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh chapter ini dalam satu program yang bisa dijalankan langsung.

Referensi #

Ringkasan #

Operator logika &&, ||, ! (beserta versi kata and, or, xor) menggabungkan nilai boolean menjadi satu kesimpulan, dengan evaluasi short-circuit yang melewati operan yang sudah tidak pengaruh. Jebakan utamanya adalah precedence: && lebih kuat dari = sementara and lebih lemah, sehingga $b = true and false menyimpan true — bukan false. Gunakan && dan || secara konsisten dan simpan versi kata hanya untuk kasus khusus. Selanjutnya kita beralih dari logika ke teks: operator string untuk menggabungkan kata menjadi kalimat.

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

contoh.php

Unduh berkas
php
<?php
// contoh.php — rangkuman Operator Logika
// Jalankan dengan: php contoh.php

echo "== Tabel kebenaran ==\n";
var_dump(true && true, true && false, false && true, false && false);
var_dump(true || true, true || false, false || false);
var_dump(true xor true, true xor false, false xor true, false xor false);
var_dump(!true, !false, !(5 > 3), !(5 < 3));

echo "\n== Menggabungkan kondisi nyata ==\n";
$stok = 3;
$harga = 50000;
$isMember = true;

var_dump($stok > 0 && $harga >= 50000);
var_dump($stok > 0 || $harga < 10000);
var_dump(!$isMember);
var_dump($isMember && $stok > 0 && $harga >= 50000);

echo "\n== Short-circuit ==\n";
function kerjaBerat(): bool {
    echo "kerjaBerat() dipanggil\n";
    return true;
}

$hasil = false && kerjaBerat();
var_dump($hasil);

$hasil = true || kerjaBerat();
var_dump($hasil);

$hasil = true && kerjaBerat();
var_dump($hasil);

echo "\n== Jebakan precedence && vs and ==\n";
$a = true && false;
$b = true and false;
var_dump($a, $b);

$c = false || true;
$d = false or true;
var_dump($c, $d);