Mengenal PHP 8.5 (rilis November 2025): pipe operator, extension URI, Clone With, atribut NoDiscard, array_first dan array_last, serta penyempurnaan CLI, plus rekap fitur 8.3-8.4 seperti property hooks dan typed class constants, hingga arah pengembangan PHP 8.6.

Kita telah menulis PHP 8.x sepanjang series ini. Episode 16 memfokuskan pada PHP 8.5 — rilis stabil terbaru yang dirilis 20 November 2025 (patch terkini 8.5.9, 30 Juli 2026) — dan fitur-fitur yang datang dari versi 8.3 hingga 8.4. Ini penting karena kalian akan membaca kode orang lain yang sudah memakai fitur ini, dan rekrutmen pun sering bertanya "fitur PHP modern apa yang kalian pakai?"
Mengapa penting? Bahasa terus berevolusi. PHP 8.5 tidak mengubah cara kalian menulis aplikasi secara fundamental, tetapi menawarkan ergonomi yang lebih baik: kode yang lebih pendek untuk pola yang sering muncul, keamanan ekstra lewat atribut, dan ekstensi baru. Memahami fitur modern membuat kalian menulis kode yang ringkas sekaligus mengikuti arah komunitas.
|>Fitur andalan PHP 8.5 adalah pipe operator — meneruskan hasil ekspresi kiri sebagai argumen pertama ekspresi kanan:
<?php
declare(strict_types=1);
$harga = 45000;
// PHP 8.5: hasil kiri diteruskan sebagai argumen pertama kanan
$total = $harga
|> fn (int $h): int => $h + (int) ($h * 0.11) // tambah pajak
|> fn (int $h): int => max($h, 10000); // terapkan minimal
echo $total, "\n"; // 49950
// gaya lama: bersarang dan urutan baca terbalik
$totalLama = max(
fn ($h) => $h + (int) ($h * 0.11)
($harga),
10000
);Dengan pipe operator, alur data dibaca kiri ke kanan: harga → tambah pajak → pastikan minimal. Bandingkan dengan gaya lama yang bersarang dari dalam — urutan transformasi lebih sulit diikuti. Fitur ini murni ergonomi: tidak mengubah cara kerja bahasa, hanya membuat pipeline data lebih terbaca.
Note
Pipe operator mirip dengan |> di Elixir/F#. Untuk mendukungnya, contoh kode di episode ini wajib PHP 8.5 — inilah mengapa di episode 0 kita menekankan versi minimal 8.5. Fitur lain di episode 16 tetap kompatibel ke 8.4 ke bawah.
PHP 8.5 menghadirkan extension URI — ekstensi parser URI yang mengikuti RFC 3986 dengan dukungan properti tambahan seperti scheme, user, pass, host, port, path, query, dan fragment secara terstruktur:
$uri = Uri::parse("https://user:pass@api.example.com:8443/path?q=php#bagian");
echo $uri->scheme, "\n"; // https
echo $uri->host, "\n"; // api.example.com
echo $uri->port, "\n"; // 8443
echo $uri->query, "\n"; // q=phpIni alternatif modern yang lebih kaya dibanding parse_url() untuk kebutuhan manipulasi URI secara lengkap — berguna saat membangun URL absolut di templating (episode 15) atau memvalidasi redirect URL agar tidak menjadi open redirect (episode 17).
Clone WithUntuk object immutable, clone biasa tidak bisa mengubah properti readonly. PHP 8.5 menambahkan Clone With:
class Alamat
{
public function __construct(
public readonly string $kota,
public readonly string $kodePos,
) {}
}
$jakarta = new Alamat("Jakarta", "10110");
// menyalin object tetapi mengganti satu properti
$bandung = $jakarta->cloneWith(kota: "Bandung");
echo $bandung->kota, " ", $bandung->kodePos, "\n";Ini melengkapi pola DTO immutable (episode 21): alih-alih mutasi, kita menghasilkan object baru dengan sebagian nilai diubah — aman dibagikan antar komponen tanpa efek samping.
#[NoDiscard]Atribut #[NoDiscard] (PHP 8.5) memperingatkan bila return value sebuah fungsi/objek tidak dipakai:
class Client
{
#[NoDiscard]
public function save(): bool
{
// melakukan penyimpanan, mengembalikan status
return true;
}
}
$client->save(); // ⚠️ warning: hasil save() diabaikan
if ($client->save()) { // ✅ benar
echo "Tersimpan\n";
}Atribut ini menangkap bug tersembunyi — fungsi yang harus dicek hasilnya (misal operasi penyimpanan, update, atau operasi dengan efek samping) tidak lagi bisa diabaikan diam-diam.
array_first() dan array_last()Dua fungsi kecil yang sangat sering dibutuhkan namun selama ini harus reset()/end() atau array[0]:
$produk = ["laptop", "monitor", "keyboard"];
$pertama = array_first($produk); // "laptop"
$terakhir = array_last($produk); // "keyboard"
$kosong = [];
array_first($kosong); // nullKeduanya menerima argumen opsional callback dan default, sekaligus tidak mengubah pointer internal array (yang menjadi jebakan reset()/end()). Melengkapi array_find() (8.4) dan array_any()/array_all() (8.4).
PHP 8.5 merapikan pengalaman command-line:
php -v dan tooling terkait menampilkan info lebih jelas.php -S (built-in server) yang lebih stabil untuk development.| Versi | Fitur andalan | Contoh |
|---|---|---|
| 8.4 (Nov 2024) | Property hooks, asymmetric visibility | public string $nama { get; set; } |
| 8.4 | Fungsi array baru | array_find(), array_any(), array_all() |
| 8.4 | Atribut #[Deprecated] | menandai API usang |
| 8.3 (Nov 2023) | Typed class constants | public const string VERSION = "1.0"; |
| 8.3 | Atribut #[Override] | memastikan method menimpa parent |
class Product
{
public float $harga {
get => $this->harga;
set => $this->harga = $value < 0 ? 0 : $value;
}
}class EmailNotifier extends Notifier
{
#[Override]
public function kirim(string $pesan): void
{
// dipastikan menimpa metode parent
}
}PHP 8.6 sedang dalam pengembangan dan dijadwalkan rilis sekitar November 2026 (melanjutkan irama tahunan: 8.3, 8.4, 8.5 → 8.6). Siklus dukungan saat ini:
| Versi | Status (Agustus 2026) |
|---|---|
| 8.5 (8.5.9) | Active support — hingga 31 Des 2027 |
| 8.5 (keamanan) | Hingga 31 Des 2029 |
| 8.4 | Active support — hingga Des 2026 |
| 8.3 | Security-only — hingga Des 2027 |
| 8.2 | EOL 31 Des 2026 |
Warning
Aturan praktis: gunakan versi dengan active support (8.5 atau 8.4 di 2026). Jangan memulai proyek baru di versi yang sudah masuk fase security-only atau EOL — pembaruan keamanan yang terlewat adalah risiko yang tidak perlu (tema episode 17 dan 19).
php -v di target.array_first() pada array dengan kunci tidak berurutan — ia mengambil elemen urutan pertama, bukan kunci 0; baca dokumentasi untuk kasus map.clone biasa dengan assignment.#[NoDiscard] berlebihan — beri hanya pada fungsi yang hasilnya memang wajib dicek; terlalu banyak memicu warning palsu.Inti yang harus dibawa pulang:
|>, extension URI, Clone With, #[NoDiscard], array_first()/array_last(), perbaikan CLI.array_find(), #[Deprecated].#[Override].Di episode 17 selanjutnya kita menutup semua lubang yang selama ini kita sebut-sebut: Keamanan Web (OWASP) — SQL Injection, XSS, CSRF, File Upload, dan SSRF, lengkap dengan mitigasi nyata untuk masing-masing. Ini episode yang menentukan apakah aplikasi kalian bertahan atau jebol di dunia nyata.