PHP Modern (Fitur PHP 8.x)
PHP terus berkembang! Versi 8.0, 8.1, dan 8.2 membawa fitur-fitur yang membuat kode lebih ringkas, aman, dan ekspresif. Fitur-fitur ini juga sangat sering digunakan di Laravel, jadi penting untuk dipahami sebelum masuk ke framework.
1. Match Expression (PHP 8.0)
match adalah versi modern dari switch — lebih ringkas, lebih aman, dan mengembalikan nilai langsung.
<?php
// ❌ Cara lama: switch (panjang, perlu break, rawan fall-through)
$status = 'aktif';
switch ($status) {
case 'aktif':
$label = '🟢 Aktif';
break;
case 'nonaktif':
$label = '🔴 Nonaktif';
break;
default:
$label = '⚪ Tidak diketahui';
break;
}
// ✅ Cara modern: match (ringkas, tidak perlu break, return nilai)
$label = match($status) {
'aktif' => '🟢 Aktif',
'nonaktif' => '🔴 Nonaktif',
default => '⚪ Tidak diketahui',
};
echo $label; // 🟢 Aktif
Keunggulan match dibanding switch:
- Tidak perlu
break — otomatis berhenti setelah cocok
- Perbandingan ketat (
===) — lebih aman dari type juggling
- Mengembalikan nilai — bisa langsung assign ke variabel
- Error jika tidak cocok — kalau tidak ada
default, PHP lempar error
<?php
// Match bisa menangani beberapa kondisi sekaligus
$hari = 'Sabtu';
$tipe = match($hari) {
'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat' => 'Hari Kerja',
'Sabtu', 'Minggu' => 'Akhir Pekan',
};
echo $tipe; // Akhir Pekan
2. Named Arguments (PHP 8.0)
Saat memanggil fungsi, kamu bisa menyebutkan nama parameter — tidak perlu ingat urutannya:
<?php
// Fungsi dengan banyak parameter
function buatUser($nama, $email, $role = 'user', $aktif = true) {
echo "$nama ($email) - Role: $role - Aktif: " . ($aktif ? 'Ya' : 'Tidak');
}
// ❌ Cara lama: harus ingat urutan, harus isi semua parameter
buatUser('Qis', '[email protected]', 'user', false);
// ✅ Named arguments: langsung sebut yang mau diisi
buatUser(
nama: 'Qis',
email: '[email protected]',
aktif: false // Skip parameter 'role', tetap pakai default
);
TIP
Kapan pakai Named Arguments?banyak parameter opsional dan kamu hanya ingin mengubah satu. Di Laravel, banyak dipakai di helper seperti route(), view(), dll.
3. Null Coalescing Operator (??)
Operator ?? memberikan nilai default jika variabel tidak ada atau bernilai null:
<?php
// ❌ Cara lama: verbose
$nama = isset($_GET['nama']) ? $_GET['nama'] : 'Guest';
// ✅ Null coalescing: ringkas
$nama = $_GET['nama'] ?? 'Guest';
// Bisa di-chain (berantai) — cek satu per satu sampai dapat yang tidak null
$tema = $_COOKIE['tema'] ?? $_SESSION['tema'] ?? 'light';
Null Coalescing Assignment (??=)
Update variabel hanya jika nilainya null:
<?php
$config = [];
$config['database'] ??= 'mysql'; // Set default karena belum ada
$config['database'] ??= 'pgsql'; // TIDAK berubah karena sudah 'mysql'
echo $config['database']; // mysql
4. Union Types (PHP 8.0)
Parameter atau return value bisa menerima lebih dari satu tipe data:
<?php
// Fungsi ini menerima int ATAU float
function hitungDiskon(int|float $harga, int|float $persen): float {
return $harga - ($harga * $persen / 100);
}
echo hitungDiskon(100000, 10); // 90000 (int)
echo hitungDiskon(99999.99, 15); // 84999.9915 (float)
// Juga mendukung null (nullable)
function cariUser(int $id): array|null {
// Bisa return array (jika ditemukan) atau null (jika tidak)
return null;
}
5. Enum (PHP 8.1)
Enum (Enumeration) mendefinisikan sekumpulan nilai yang tetap dan terbatas — seperti status, kategori, atau role:
<?php
// Mendefinisikan Enum
enum StatusPesanan: string {
case Baru = 'baru';
case Diproses = 'diproses';
case Dikirim = 'dikirim';
case Selesai = 'selesai';
case Dibatalkan = 'dibatalkan';
}
// Menggunakan Enum
$status = StatusPesanan::Baru;
echo $status->value; // 'baru'
echo $status->name; // 'Baru'
// Validasi otomatis — kalau value salah, PHP lempar error!
$dari_db = StatusPesanan::from('dikirim'); // ✅ OK
$salah = StatusPesanan::from('hilang'); // ❌ ValueError!
// tryFrom() untuk handling yang lebih aman
$coba = StatusPesanan::tryFrom('hilang'); // null (tidak error)
Kenapa Enum Lebih Baik dari String Biasa?
<?php
// ❌ Tanpa Enum: rawan typo, tidak ada validasi
$status = 'diprose'; // Typo! Harusnya 'diproses'
// PHP diam-diam menerima dan program jadi bug 🐛
// ✅ Dengan Enum: IDE auto-complete, typo langsung error
$status = StatusPesanan::Diproses; // Aman, pasti benar
NOTE
- Kolom status di database (casting otomatis)
- Validasi form (
Rule::enum(StatusPesanan::class))
- API response yang konsisten
6. Readonly Properties (PHP 8.1)
Property yang hanya bisa di-set sekali (di constructor) dan tidak bisa diubah setelahnya:
<?php
class User {
public function __construct(
public readonly string $nama,
public readonly string $email,
public readonly string $role = 'user'
) {}
}
$user = new User('Qis', '[email protected]');
echo $user->nama; // Qis ✅
$user->nama = 'Lain'; // ❌ Error: Cannot modify readonly property
TIP
// ❌ Cara lama (verbose)
class User {
public string $nama;
public function __construct(string $nama) {
$this->nama = $nama;
}
}
// ✅ Constructor Promotion (ringkas)
class User {
public function __construct(
public string $nama
) {}
}
7. Nullsafe Operator (?->) (PHP 8.0)
Akses property/method dari objek yang mungkin null tanpa error:
<?php
// ❌ Cara lama: cek null bertingkat
$negara = null;
if ($user !== null) {
$alamat = $user->getAlamat();
if ($alamat !== null) {
$negara = $alamat->getNegara();
}
}
// ✅ Nullsafe: ringkas dan aman
$negara = $user?->getAlamat()?->getNegara();
// Jika $user null, atau getAlamat() null → hasilnya null (tidak error)
8. First-class Callable Syntax (PHP 8.1)
Referensi ke fungsi bisa disimpan dalam variabel:
<?php
$angka = [3, 1, 4, 1, 5, 9, 2];
// ❌ Cara lama
$hasil = array_filter($angka, function($n) { return $n > 3; });
// ✅ Arrow function (PHP 7.4+)
$hasil = array_filter($angka, fn($n) => $n > 3);
// ✅ First-class callable (PHP 8.1)
$panjang = array_map(strlen(...), ['Halo', 'Dunia']); // [4, 5]
Ringkasan Fitur per Versi
Latihan
- Refactor kode
switch di project Toko Onlinemu menjadi match
- Buat Enum
KategoriProduk dengan case: Elektronik, Fashion, Makanan, Lainnya
- Gunakan named arguments untuk memanggil
password_hash() — coba skip parameter ke-2 dengan named arg
Selanjutnya
Sekarang kamu sudah kenal fitur-fitur PHP modern! Lanjut ke Tipe Data & Type System → untuk memahami bagaimana PHP mengelola tipe data secara aman.