Atribut, Nullsafe & Fitur Modern PHP 8.x
Atribut (#[...]) dan Reflection, operator nullsafe, static return, WeakMap, fibers sekilas, serta tur fitur PHP 8.3 & 8.4.
Nullsafe operator ?-> (8.0)
Sebelumnya, membaca data bersarang yang mungkin null butuh banyak if. Sekarang cukup:
// sebelum
$kota = null;
if ($user !== null && $user->alamat !== null) {
$kota = $user->alamat->kota;
}
// PHP 8
$kota = $user?->alamat?->kota; // null jika salah satunya null
Rantai dihentikan di null pertama dan seluruh ekspresi bernilai null. Gabungkan dengan ?? untuk nilai cadangan: $user?->alamat?->kota ?? 'Tidak diketahui'.
Atribut — metadata di atas kode (8.0)
Atribut menggantikan "anotasi di komentar" dengan sintaks resmi #[...] yang bisa dibaca lewat Reflection. Framework memakainya untuk routing, validasi, dan konfigurasi ORM.
#[Attribute(Attribute::TARGET_METHOD)]
class Route
{
public function __construct(
public string $path,
public string $method = 'GET',
) {}
}
class ProdukController
{
#[Route('/produk', method: 'GET')]
public function index(): string { return 'daftar produk'; }
}
// membaca atribut
$ref = new ReflectionMethod(ProdukController::class, 'index');
foreach ($ref->getAttributes(Route::class) as $attr) {
$route = $attr->newInstance(); // objek Route
echo $route->method . ' ' . $route->path;
}
Atribut bawaan yang berguna: #[\Override] (8.3), #[\Deprecated] (8.4), #[\SensitiveParameter] (8.2 — menyembunyikan nilai parameter dari stack trace, cocok untuk password).
Ekspresi throw (8.0)
throw kini berupa ekspresi sehingga boleh dipakai di tempat nilai:
$nama = $input['nama'] ?? throw new InvalidArgumentException('nama wajib');
$fn = fn () => throw new LogicException('belum diimplementasi');
Catch tanpa variabel & trailing comma
try { risky(); } catch (RuntimeException) { /* variabel $e tidak diperlukan */ }
function f(int $a, int $b,) {} // koma di akhir daftar parameter boleh
Fitur 8.1 – 8.2 yang belum dibahas
- Pure intersection types (8.1):
Iterator&Countable $x - Fibers (8.1): konkurensi ringan yang jadi fondasi library async seperti Revolt/ReactPHP.
- new di inisialisasi (8.1):
public function __construct(private Logger $log = new NullLogger()) - Akses konstanta enum dengan
->(8.2) dan pelacakan#[SensitiveParameter] - Random\Randomizer (8.2): API acak berorientasi objek yang bisa diberi seed
PHP 8.3
- Typed class constants:
const string STATUS_AKTIF = 'aktif'; - Dynamic class constant fetch:
Kelas::{$nama} json_validate(): cek validitas JSON tanpa membangun array-nya.#[\Override]: pastikan method memang menimpa induknya.
PHP 8.4
- Property hooks: logika
get/setlangsung di properti, tanpa getter & setter manual:class Pengguna { public string $nama { set => ucwords($value); get => trim($this->nama); } } - Asymmetric visibility:
public private(set) int $stok;— publik dibaca, privat ditulis. newtanpa kurung tambahan:new Pengguna()->nama.- Fungsi array baru:
array_find(),array_any(),array_all(). - Lazy objects dan parser HTML5 (
Dom\HTMLDocument).
Catatan: fitur 8.4 hanya berjalan di server ber-PHP 8.4. Selalu periksa versi di composer.json ("php": "^8.3") sebelum memakainya di proyek.
Cara memantau perubahan PHP
Baca UPGRADING/Release Notes di php.net, aktifkan error_reporting(E_ALL) saat pengembangan, dan gunakan PHPStan atau Rector untuk menemukan kode usang serta memigrasikannya otomatis.