Sistem Tipe PHP 8
declare(strict_types=1), union & nullable types, mixed, never, static, TypeError, dan cara membuat kode lebih aman dengan tipe.
Mengapa tipe penting?
PHP aslinya longgar soal tipe — dan itu enak untuk skrip kecil, tetapi berbahaya di aplikasi besar. Deklarasi tipe membuat bug tertangkap lebih awal (saat kode dijalankan, bukan saat pelanggan mengeluh), memberi dokumentasi otomatis, dan membuat editor/IDE pintar mengarahkanmu.
strict_types
Tanpa strict_types, PHP diam-diam mengonversi: hitung("5") ke parameter int tetap jalan. Dengan mode ketat, PHP melempar TypeError. Tulis ini di baris pertama setiap berkas:
<?php
declare(strict_types=1);
function kuadrat(int $x): int { return $x * $x; }
kuadrat(4); // ok
kuadrat("4"); // TypeError: argumen harus int, string diberikan
Pengecualian: int boleh masuk ke parameter float (pelebaran aman). Mode ketat berlaku untuk pemanggilan yang ditulis di berkas itu.
Jenis tipe yang tersedia
| Tipe | Arti | Sejak |
|---|---|---|
int float string bool array | Scalar & array | 7.0 + |
?string | String atau null | 7.1 |
int|string | Union: salah satu dari beberapa tipe | 8.0 |
mixed | Tipe apa saja (hindari bila bisa lebih spesifik) | 8.0 |
static | Kembalian: objek dari class pemanggil (method chaining) | 8.0 |
never | Fungsi tidak pernah kembali (selalu throw/exit) | 8.1 |
A&B | Intersection: objek harus memenuhi A dan B | 8.1 |
null, false, true mandiri | Boleh dipakai sebagai tipe sendiri | 8.2 |
(A&B)|null | DNF types | 8.2 |
Contoh nyata
function cariHarga(array $daftar, string $kode): int|float|null
{
return $daftar[$kode] ?? null;
}
function gagal(string $pesan): never
{
throw new RuntimeException($pesan);
}
function dapatkanId(int|string $id): string
{
return (string) $id;
}
Tipe pada properti dan konstanta
Properti class juga bisa bertipe (private int $stok;) dan PHP 8.3 menambah typed class constants (const string NAMA = 'x';). Properti bertipe yang belum diisi berstatus uninitialized: membacanya melempar Error, sehingga bug "lupa mengisi" tidak lolos.
Menangani TypeError
try {
echo kuadrat("abc");
} catch (TypeError $e) {
echo "Salah tipe: " . $e->getMessage();
}
Di aplikasi nyata, lebih baik memvalidasi input di batas sistem (form, API) dan mengubahnya ke tipe yang benar sekali, lalu bagian dalam aplikasi memakai tipe ketat.
Perubahan penting PHP 8 yang berkaitan dengan tipe
- Aritmetika pada array/objek/non-numerik kini melempar
TypeError(sebelumnya sekadar warning). - String numerik dengan spasi di akhir (
"123 ") dianggap numerik. - Fungsi bawaan melempar
ValueErroruntuk argumen yang nilainya tak valid. - Perbandingan
0 == "abc"tidak lagitrue.