Sebuah ekspresi adalah potongan kode yang menghasilkan nilai — misalnya $harga * 3 atau $status === "aktif". Kode Laravel tersusun dari ekspresi-ekspresi seperti ini: validasi membandingkan nilai, config menjatuhkan diri ke nilai default, dan pengurutan daftar membandingkan angka prioritas. Chapter ini membahas operator PHP yang paling sering muncul saat kita membaca kode framework, mulai dari aritmetika hingga operator khas PHP seperti null coalescing dan spaceship.

Operator Aritmetika dan Penggabungan String #

Operator aritmetika bekerja seperti pada matematika: +, -, *, /, % (sisa bagi), dan ** (perpangkatan). Operator titik (.) menggabungkan string, sedangkan .= menambahkan string ke variabel yang sudah ada:

php
<?php
$total = 150000 * 3;
$bayar = $total - ($total * 0.2);

echo "Total: $total\n";
echo "Bayar: $bayar\n";
echo "Sisa bagi: ", 7 % 3, "\n";
echo "Perpangkatan: ", 2 ** 10, "\n";

$namaDepan = "Budi";
$namaBelakang = "Santoso";
$namaLengkap = $namaDepan . " " . $namaBelakang;
echo "Nama: $namaLengkap\n";

Output yang Dihasilkan:

text
Total: 450000
Bayar: 360000
Sisa bagi: 1
Perpangkatan: 1024
Nama: Budi Santoso

PHP juga menyediakan bentuk gabungan untuk operator yang menulis kembali variabelnya sendiri: +=, -=, *=, /=, dan .=. Pola ini muncul di counter dan akumulator di berbagai framework:

php
<?php
$total = 0;
$total += 5;   // sama dengan $total = $total + 5
$total -= 2;
echo "Nilai akhir: $total\n";

$views = [];
$views['halaman'] = ($views['halaman'] ?? 0) + 1;
$views['halaman'] = ($views['halaman'] ?? 0) + 1;
echo "Views: ", $views['halaman'], "\n";

Output yang Dihasilkan:

text
Nilai akhir: 3
Views: 2

Baris $total += 5 membaca nilai lama $total, menambah 5, lalu menyimpan hasilnya kembali ke $total. Baris $views['halaman'] memadukan dua konsep sekaligus: operator ?? memberi nilai awal 0 ketika kunci belum ada, lalu += menaikkan nilainya — pola inisialisasi-saat-dibutuhkan yang sering kita jumpai saat menghitung agregasi data.

Perbandingan Longgar vs Ketat #

Perbedaan == dan === adalah salah satu hal pertama yang harus dikuasai sebelum membaca kode Laravel, karena framework ini hampir selalu memilih perbandingan ketat:

php
<?php
$status = "0";

var_dump($status == 0);     // true  — "0" dikonversi ke int dulu
var_dump($status === 0);    // false — string tidak identik dengan int
var_dump($status === "0"); // true  — nilai dan tipe sama

Output yang Dihasilkan:

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

Operator == melakukan loose comparison: interpreter mengonversi kedua operand ke tipe yang sama sebelum membandingkan. Operator === melakukan strict comparison: nilai dan tipe harus identik. Tabel berikut merangkum pasangan yang paling relevan:

Kondisi=====
"5" vs 5truefalse
null vs ""truefalse
0 vs "0"truefalse
"aktif" vs "aktif"truetrue

Operator Logika #

Operator && (AND), || (OR), dan ! (NOT) menggabungkan beberapa ekspresi boolean. PHP mengevaluasi secara short-circuit: operand kanan tidak dievaluasi bila operand kiri sudah menentukan hasil:

php
<?php
$stok = 10;
$isActive = true;

$bisaJual = $stok > 0 && $isActive;      // kedua syarat harus benar
$perluRestock = !$bisaJual || $stok < 5; // salah satu cukup

var_dump($bisaJual);
var_dump($perluRestock);

Output yang Dihasilkan:

text
bool(true)
bool(false)

Null Coalescing dan Ternary #

Operator ?? mengembalikan operand kanan jika operand kiri bernilai null. Operator ini muncul di mana-mana di kode sumber Laravel karena banyak nilai konfigurasi boleh kosong:

php
<?php
$konfigurasi = [
    "cache" => ["default" => "database"],
];

$cacheDriver = $konfigurasi["cache"]["default"] ?? "file";
$queueDriver = $konfigurasi["queue"]["default"] ?? "sync";

echo "Cache: $cacheDriver\n";
echo "Queue: $queueDriver\n";

$saldo = 75000;
echo "Status: ", ($saldo >= 50000 ? "cukup" : "kurang"), "\n";

Output yang Dihasilkan:

text
Cache: database
Queue: sync

Baris $cacheDriver membaca kunci yang memang ada, sehingga nilai "database" yang dipakai. Baris $queueDriver membaca kunci queue yang tidak ada — tanpa ??, akses tersebut memicu warning; dengan ??, PHP mengembalikan "sync" secara aman. Operator ternary kondisi ? nilaiA : nilaiB memilih satu dari dua nilai berdasarkan kondisi, seperti pada baris status saldo.

Pola ?? adalah wajah paling sering terlihat dari operator ini di aplikasi Laravel. Ketika membaca konfigurasi atau nilai request, kita akan menulis baris seperti berikut (contoh tampilan):

php
// ambil nilai dari query string, jatuh ke 15 bila tidak dikirim
$perPage = $request->input('per_page') ?? 15;

Di framework sendiri, kode sumber Illuminate\Http\Request memakai pola $this->headers->get('Purpose') ?? '' untuk membaca header HTTP yang bisa saja tidak hadir, dan method Str::excerpt() memakai $options['omission'] ?? '...' untuk menetapkan elipsis default pada cuplikan teks.

Spaceship untuk Pengurutan #

Operator spaceship <=> mengembalikan -1, 0, atau 1 tergantung operand kiri lebih kecil, sama, atau lebih besar dari operand kanan. Nilai kembalian tersebut persis yang dibutuhkan usort():

php
<?php
$tugas = [
    ["judul" => "Belajar Routing", "prioritas" => 2],
    ["judul" => "Deploy Aplikasi", "prioritas" => 1],
    ["judul" => "Tulis Migration", "prioritas" => 3],
];

usort($tugas, fn ($a, $b) => $a["prioritas"] <=> $b["prioritas"]);

foreach ($tugas as $t) {
    echo $t["prioritas"], " - ", $t["judul"], "\n";
}

Output yang Dihasilkan:

text
1 - Deploy Aplikasi
2 - Belajar Routing
3 - Tulis Migration

Callback fn ($a, $b) => $a["prioritas"] <=> $b["prioritas"] mengurutkan array dari prioritas terkecil ke terbesar; ganti posisi operand menjadi $b <=> $a untuk urutan menurun. Setelah operator terkuasai, kita perlu alat untuk memilih cabang logika dan mengulang data — if, match, dan loop adalah topik chapter berikutnya.