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.

Part 12 dari 22 ± 45 menit Gratis

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/set langsung 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.
  • new tanpa 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.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X