Di PHP modern, tipe bisa ditulis langsung di fungsi: tipe apa yang boleh masuk, dan tipe apa yang keluar. Bayangin laci kasir Bu Tini. Ada kotak khusus uang kertas, kotak koin, dan kotak struk, masing-masing berlabel. Kalau ada yang menaruh struk di kotak uang, Bu Tini langsung menolaknya, sebelum salah hitung terjadi. Label di kotak itu type declaration, dan penolakannya TypeError.
🧪 Tebakan cepat: fungsi
totalHarga(int $harga, int $jumlah): intdipanggil dengantotalHarga(15000, "2"). Output-nya30000atau TypeError? Tebak dulu, jawabannya ada di bagian "strict_types: berhenti menebak".
Fungsi dengan tipe
Fungsi adalah kumpulan kode bernama yang bisa dipanggil berkali-kali. Lesson Fungsi membahasnya lengkap, di sini cukup bentuk dasarnya:
<?php
function totalHarga(int $harga, int $jumlah): int
{
return $harga * $jumlah;
}
echo totalHarga(15000, 2);
30000
function totalHarga(...)membuat fungsi bernamatotalHarga.int $harga, int $jumlahadalah parameter, nilai yang dikirim saat fungsinya dipanggil.intdi depan tiap parameter adalah tipe yang boleh masuk.: intsesudah kurung adalah return type, tipe nilai yang keluar.returnmengirim hasilnya keluar dari fungsi.totalHarga(15000, 2)memanggil fungsinya:$hargajadi 15000,$jumlahjadi 2.
Kalau tipenya gak cocok
Isi form selalu string, jadi $jumlah sering datang sebagai "2". Ini yang terjadi untuk tiap argumen kedua:
| Argumen kedua | Tanpa strict_types | Dengan strict_types |
|---|---|---|
2 |
30000 |
30000 |
"2" |
30000, "2" diubah jadi 2 |
TypeError, string given |
"dua" |
TypeError, string given | TypeError, string given |
2.5 |
30000 plus Deprecated |
TypeError, float given |
null |
TypeError, null given | TypeError, null given |
Tanpa pengaturan apa pun PHP memakai coercive mode: string yang isinya angka diubah jadi angka. "dua" gak bisa diubah, jadi PHP berhenti:
Fatal error: Uncaught TypeError: totalHarga(): Argument #2 ($jumlah) must be of type int, string given, called in /app/kasir.php on line 8 and defined in /app/kasir.php:3
Baca pesannya dari kiri: fungsi totalHarga(), argumen ke-2 ($jumlah), harusnya int, yang datang string, dipanggil di baris 8, fungsinya ditulis di baris 3.
strict_types: berhenti menebak
<?php
declare(strict_types=1);
function totalHarga(int $harga, int $jumlah): int
{
return $harga * $jumlah;
}
echo totalHarga(15000, "2");
Fatal error: Uncaught TypeError: totalHarga(): Argument #2 ($jumlah) must be of type int, string given, called in /app/kasir.php on line 9 and defined in /app/kasir.php:4
declare(strict_types=1);mematikan perubahan tipe otomatis untuk panggilan di file itu. Cuma int yang boleh masuk ke parameterint.- Tanpa baris ini,
totalHarga(15000, "2")menulis30000. Dengan baris ini, TypeError. Itu jawaban tebakannya: tergantung satu baris. - Satu pengecualian: int tetap boleh masuk ke parameter
float. - Baris ini harus jadi perintah pertama sesudah
<?php. Kalau ada perintah lain di atasnya:Fatal error: strict_types declaration must be the very first statement in the script.
Nullable ? dan union |
Kasir Bu Tini mencari harga dari kode menu. Kodenya bisa nomor (1) atau teks ("es-teh"), dan kadang gak ketemu:
<?php
function hargaMenu(int|string $kode): ?int
{
$daftar = [
1 => 15000,
"es-teh" => 5000,
];
if (isset($daftar[$kode])) {
return $daftar[$kode];
}
return null;
}
var_dump(hargaMenu(1));
var_dump(hargaMenu("es-teh"));
var_dump(hargaMenu(99));
int(15000)
int(5000)
NULL
int|stringadalah union type (PHP 8.0): parameternya menerima int atau string.?intadalah nullable type: hasilnya int, ataunullkalau gak ketemu.?intsama denganint|null.$daftaradalah array dengan kunci: kunci di kiri=>menunjuk ke nilai di kanan. Lesson Array membahasnya lengkap.isset($daftar[$kode])menjawabtruekalau kunci itu ada, danif (...) { ... }menjalankan isinya cuma kalau syaratnyatrue.- Kode 99 gak ada, jadi fungsinya sampai di
return null. Kalau baris itu lupa, PHP menolak:hargaMenu(): Return value must be of type ?int, none returned. echountuk null gak menulis apa pun. Untuk mengecek null, pakaivar_dumpatauvar_export(hargaMenu(99) === null);, yang menulistrue.
== dan ===
var_dump("15000" == 15000); // bool(true)
var_dump("15000" === 15000); // bool(false)
var_dump(0 == "a"); // bool(false)
var_dump("1" == "01"); // bool(true)
==menyamakan tipe dulu, baru membandingkan.===juga mengecek tipenya: string lawan int langsungfalse.- PHP 8 mengubah aturan angka lawan teks:
0 == "a"sekarangfalse(di PHP 7true). - Dua string berisi angka tetap dibandingkan sebagai angka, jadi
"1" == "01"bernilaitrue. Biasakan===.
📌 Tipe lain yang akan kamu temui
void: fungsinya gak mengembalikan nilai, misalnya cuma mencetak nota.mixed: tipe apa pun boleh. Hindari kalau tipenya sebenarnya bisa ditulis.never: fungsinya gak pernah selesai normal, selalu melempar error atau berhenti.- Intersection type (
A&B) dan propertyreadonlydipakai di class, dibahas di lesson OOP.
⚠️ Jebakan yang sering ketemu
declarebukan baris pertama. Taruhdeclare(strict_types=1);tepat sesudah<?php, sebelum perintah lain.- Isi form dikirim apa adanya. Dengan strict_types, string
"2"ditolak. Ubah dulu ke int, misalnya(int) "2", sebelum dikirim ke parameterint. - Nullable tanpa
return null.?intmengizinkan null, tapi null-nya tetap harus di-return. - Mengecek null dengan echo.
echo nullmenulis kosong, jadi kelihatan seperti string kosong. Pakai=== null.
TL;DR: Tipe ditulis di fungsi: function totalHarga(int $harga, int $jumlah): int. Tanpa pengaturan PHP mengubah "2" jadi 2 tapi menolak "dua" dan null dengan TypeError, sedangkan declare(strict_types=1); di baris pertama membuat cuma int yang lolos. ?int berarti int atau null (? = nullable), int|string berarti salah satunya (| = union). Fungsi nullable tetap harus return null, dan null dicek dengan === null, bukan echo. == menyamakan tipe dulu ("15000" == 15000 true), === juga mengecek tipe, jadi biasakan ===.