Pertama kali lihat changelog PHP 8.4, reaksi saya langsung: "Akhirnya!" Setelah bertahun-tahun bikin getter dan setter manual di setiap class, PHP akhirnya punya Property Hooks yang bikin hidup jauh lebih gampang. Dan itu cuma salah satu dari sekian banyak perubahan besar di versi ini.
PHP 8.4 dirilis pada November 2024 dan membawa perubahan signifikan yang sudah lama ditunggu komunitas. Kalau kamu masih pakai PHP 8.1 atau 8.2, ini saat yang tepat untuk upgrade. Artikel ini bakal bahas fitur-fitur baru yang paling impactful, lengkap dengan contoh kode yang bisa langsung kamu coba.
Ini dia fitur yang paling ditunggu. Property hooks memungkinkan kamu menambahkan logic getter dan setter langsung di deklarasi property, tanpa perlu method terpisah. Sebelum PHP 8.4, kalau mau validasi atau transformasi data di property, kamu harus bikin method getX() dan setX() secara manual.
Cara lama (sebelum PHP 8.4):
class User {
private string $name;
private string $email;
public function getName(): string {
return $this->name;
}
public function setName(string $value): void {
if (strlen($value) < 3) {
throw new InvalidArgumentException("Nama minimal 3 karakter");
}
$this->name = trim($value);
}
public function getEmail(): string {
return strtolower($this->email);
}
public function setEmail(string $value): void {
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException("Email tidak valid");
}
$this->email = $value;
}
}
Cara baru dengan PHP 8.4 Property Hooks:
class User {
public string $name {
set(string $value) {
if (strlen($value) < 3) {
throw new InvalidArgumentException("Nama minimal 3 karakter");
}
$this->name = trim($value);
}
}
public string $email {
get => strtolower($this->email);
set(string $value) {
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException("Email tidak valid");
}
$this->email = $value;
}
}
}
// Penggunaan - property terasa seperti property biasa
$user = new User();
$user->name = "Andi"; // otomatis validasi
$user->email = "[email protected]"; // otomatis lowercase
echo $user->email; // "[email protected]"
Perbedaannya signifikan. Code yang tadinya 20+ baris jadi 10 baris. Dan yang lebih penting, property hooks bekerja dengan interface dan abstract class. Jadi kamu bisa definisikan contract di interface dan implementasikan di class:
interface HasSlug {
public string $slug {
get;
set;
}
}
class Article implements HasSlug {
public string $title;
public string $slug {
get => strtolower(str_replace(' ', '-', $this->title));
set {
$this->title = ucwords(str_replace('-', ' ', $value));
}
}
}
Kalau kamu tertarik mendalami lebih lanjut tentang pola OOP di PHP, cek juga tutorial membangun REST API dengan CodeIgniter 4 yang membahas prinsip-prinsip serupa dalam konteks framework.
Fitur kecil tapi sangat memanjakan. Sekarang kamu bisa langsung memanggil method pada object yang baru dibuat tanpa perlu mengapit constructor call dengan kurung buka-tutup tambahan.
// Sebelum PHP 8.4 - harus pakai kurung ekstra
$result = (new DateTime())->format('Y-m-d');
$slug = (new SlugGenerator())->generate('Hello World');
// PHP 8.4 - langsung bisa chain
$result = new DateTime()->format('Y-m-d');
$slug = new SlugGenerator()->generate('Hello World');
Kedengarannya sepele, tapi kalau kamu sering bikin fluent method chains, ini menghemat banyak keystroke dan bikin kode lebih readable.
PHP 8.4 menambahkan empat array function baru yang sangat berguna: array_find(), array_find_key(), array_any(), dan array_all(). Sebelumnya, kalau mau cari elemen dalam array berdasarkan kondisi, kamu harus pakai loop atau array_filter() yang kurang elegan.
$users = [
['name' => 'Andi', 'age' => 25, 'active' => true],
['name' => 'Budi', 'age' => 17, 'active' => true],
['name' => 'Citra', 'age' => 30, 'active' => false],
['name' => 'Dewi', 'age' => 22, 'active' => true],
];
// array_find: cari elemen pertama yang cocok
$adult = array_find($users, fn($u) => $u['age'] >= 18);
// ['name' => 'Andi', 'age' => 25, 'active' => true]
// array_find_key: cari KEY dari elemen pertama yang cocok
$firstInactiveKey = array_find_key($users, fn($u) => !$u['active']);
// 2 (index dari Citra)
// array_any: apakah ADA minimal satu elemen yang cocok?
$hasMinor = array_any($users, fn($u) => $u['age'] < 18);
// true (Budi umur 17)
// array_all: apakah SEMUA elemen cocok?
$allActive = array_all($users, fn($u) => $u['active']);
// false (Citra tidak aktif)
Fungsi array_find() return elemennya langsung (bukan array baru seperti array_filter()), dan return NULL kalau tidak ketemu. Ini jauh lebih intuitif untuk use case "cari satu elemen yang cocok".
Contoh praktis untuk validasi form:
function validateRegistration(array $data): ?string {
$rules = [
'username' => ['required', 'min:3', 'max:20'],
'email' => ['required', 'email'],
'password' => ['required', 'min:8'],
];
foreach ($rules as $field => $checks) {
$failed = array_find($checks, function($check) use ($data, $field) {
return !validateRule($check, $data[$field] ?? null);
});
if ($failed !== null) {
return "Field '$field' gagal validasi: $failed";
}
}
return null; // semua valid
}
PHP 8.4 juga mendeprecate beberapa fitur lama yang sudah jarang dipakai. Penting untuk tahu ini sebelum upgrade, supaya tidak kaget dengan warning di production.
function foo(string $x = null) dianggap nullable secara implisit. Di PHP 8.4, kamu harus eksplisit: function foo(?string $x = null).exit() dan die() sekarang dianggap sebagai function, bukan language construct. Ini mempengaruhi cara kamu menggunakannya di expression context.Untuk mengecek apakah kode kamu aman, jalankan:
# Install PHP-CS-Fixer untuk deteksi deprecated usage
composer require --dev friendsofphp/php-cs-fixer
# Atau gunakan Rector untuk auto-fix
composer require --dev rector/rector
vendor/bin/rector process src/ --dry-run
PHP 8.4 menambahkan dukungan penuh untuk parsing HTML5 melalui class Dom\HTMLDocument. Sebelumnya, DOMDocument punya banyak masalah dengan HTML5 modern (tidak support tag seperti <article>, <section>, dll).
use Dom\HTMLDocument;
$html = <<<'HTML'
<!DOCTYPE html>
<html>
<body>
<article>
<h1>Judul Artikel</h1>
<p>Konten di sini</p>
</article>
</body>
</html>
HTML;
$doc = HTMLDocument::createFromString($html, LIBXML_NOERROR);
$articles = $doc->getElementsByTagName('article');
foreach ($articles as $article) {
echo $article->textContent; // "Judul Artikel Konten di sini"
}
Ini sangat berguna untuk web scraping dan parsing konten HTML. Kalau kamu butuh data dari web, kombinasikan dengan library HTTP seperti Guzzle atau built-in file_get_contents().
Untuk kamu yang bekerja dengan perhitungan keuangan atau angka presisi tinggi, PHP 8.4 menambahkan class BcMath\Number sebagai alternatif OOP untuk fungsi-fungsi bcadd(), bcsub(), dll.
use BcMath\Number;
// Cara lama
$total = bcadd('19.99', '5.01', 2);
$result = bcmul($total, '1.11', 2);
// Cara baru PHP 8.4
$price = new Number('19.99');
$tax = new Number('5.01');
$total = $price->add($tax); // 25.00
$withPpn = $total->mul('1.11'); // 27.75
// Bisa langsung di-echo dan di-compare
echo $withPpn; // "27.75"
var_dump($withPpn > new Number('25')); // true
Class BcMath\Number immutable, jadi setiap operasi menghasilkan object baru. Ini mirip dengan pola yang dipakai library Carbon untuk DateTime.
Kalau kamu pakai Ubuntu, upgrade PHP cukup straightforward:
# Tambah PPA repository
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# Install PHP 8.4
sudo apt install php8.4 php8.4-cli php8.4-common php8.4-curl \
php8.4-mbstring php8.4-xml php8.4-zip php8.4-mysql php8.4-fpm
# Cek versi
php -v
# Set sebagai default (kalau punya multiple versi)
sudo update-alternatives --set php /usr/bin/php8.4
Sebelum upgrade di production, jalankan dulu compatibility check:
# Install composer compatibility checker
composer require --dev phpcompatibility/phpcompatibility-wp
vendor/bin/phpcs -p . --standard=PHPCompatibility --runtime-set testVersion 8.4
Kalau kamu pakai framework, pastikan versi framework mendukung PHP 8.4:
Tertarik tahu lebih banyak tentang workflow development yang proper? Baca juga artikel tentang Git Workflow Terbaik 2026 untuk menemukan branching strategy yang cocok untuk tim kamu.
PHP 8.4 adalah update terbesar sejak PHP 8.0. Property Hooks alone sudah cukup jadi alasan untuk upgrade, ditambah array functions baru yang bikin manipulasi data jauh lebih clean. Kalau kamu masih di PHP 8.1 atau 8.2, sekarang waktu yang tepat untuk mulai migrasi.
Satu saran: jangan langsung upgrade production. Test dulu di staging environment, jalankan compatibility checker, dan pastikan semua dependencies mendukung PHP 8.4. Proses upgrade di Ubuntu cukup mudah dengan PPA ondrej/php, tapi selalu backup dulu sebelum melakukan perubahan besar.
Fitur PHP 8.4 mana yang paling kamu tunggu? Property Hooks, array functions, atau yang lain? Share di kolom komentar!