Peta level error sudah kita pegang; sekarang saatnya turun ke medan sesungguhnya. Tiga label yang paling sering muncul di layar pemula adalah Warning, Deprecated, dan Fatal error — masing-masing dengan pemicu khas dan tingkat kerusakan yang berbeda. Pada chapter ini kita membedah pemicu paling umum dari setiap kategori, memahami mengapa PHP 8 mengubah beberapa aturan lama, lalu mempraktikkan cara memperbaiki setiap kegagalan hingga pesannya hilang.
Peta Kategori Kegagalan #
Sebelum masuk ke contoh, tabel berikut merangkum tiga kategori utama beserta kategori warisan Notice:
| Kategori | Tampil sebagai | Eksekusi lanjut | Pemicu umum |
|---|---|---|---|
| Fatal error | Fatal error: Uncaught Error: ... | tidak, exit 255 | function atau konstanta tidak ada, membagi dengan nol |
| Warning | Warning: ... | ya | variabel atau array key tidak terdefinisi, berkas tidak ditemukan |
| Deprecated | Deprecated: ... | ya | memakai fitur yang ditandai akan dihapus |
| Notice (warisan) | Notice: ... | ya | di PHP 7: variabel dan array key tak terdefinisi |
Catatan migrasi penting: sejak PHP 8.0, membaca variabel atau kunci array yang tidak terdefinisi tidak lagi menghasilkan Notice melainkan Warning, dan membaca konstanta yang tidak ada langsung menjadi fatal error. Perubahan ini disebut reclassification — pesan yang dulu dianggap angin lalu kini diperlakukan lebih serius. Kode tutorial lama yang “berjalan lancar” di PHP 7 bisa jadi berperingkat Warning di PHP 8, jadi selalu uji kode pada versi yang sama dengan lingkungan produksi Anda.
Warning: Masalah yang Tidak Menghentikan Program #
Dua pemicu Warning terbanyak dalam praktik adalah variabel yang tidak terdefinisi dan kunci array yang tidak ada. Keduanya sudah kita sengaja temui pada chapter pertama; berikut bentuk kedua pemicu tersebut pada operasi membaca stok barang:
<?php
$stok = ["apel" => 10, "jeruk" => 7];
echo "Stok jeruk: {$stok["jeruk"]}\n";
echo "Stok manggis: " . $stok["manggis"] . "\n";Output yang Dihasilkan:
Stok jeruk: 7
Warning: Undefined array key "manggis" in /home/z/my-project/php-course/content/php/error-handling/warnings-notices-dan-fatal-errors/.verify_tmp.php on line 5
Stok manggis:Mari kita telaah kejadian pada contoh di atas:
- Baris 4: kunci
"jeruk"tersedia di array$stok, sehinggaechomencetakStok jeruk: 7dengan normal. - Baris 5: kunci
"manggis"tidak ada, sehingga engine memancarkanWarning: Undefined array key "manggis"; nilai bawaannyanullmembuat baris tetap mencetakStok manggis:tanpa angka.
Perbaikan yang tepat adalah menyatakan nilai cadangan secara eksplisit dengan operator null coalescing (??) alih-alih membiarkan engine mengganti dengan null secara diam-diam:
<?php
$stok = ["apel" => 10, "jeruk" => 7];
echo "Stok jeruk: {$stok["jeruk"]}\n";
echo "Stok manggis: " . ($stok["manggis"] ?? 0) . "\n";Output yang Dihasilkan:
Stok jeruk: 7
Stok manggis: 0Pada baris 5 versi kedua ini, ekspresi $stok["manggis"] ?? 0 membaca kunci yang tidak ada, lalu menggantinya dengan 0 tanpa memancarkan Warning apa pun. Program kini menyatakan maksudnya dengan jelas: barang yang tidak tercatat dianggap stok nol. Pola yang sama berlaku untuk variabel — beri nilai awal sebelum dibaca, atau gunakan ?? saat ketiadaan nilai memang skenario yang wajar.
Deprecated: Peringatan Masa Transisi #
Deprecated muncul ketika kita memakai fitur yang masih berfungsi namun sudah dijadwalkan untuk dihapus pada versi PHP berikutnya. Pesannya selalu disertai saran pengganti, sehingga bisa dibaca seperti daftar tugas. Contoh nyatanya di PHP 8.4 adalah parameter yang implicitly nullable — deklarasi string $nama = null yang secara diam-diam menjadikan parameter boleh null:
<?php
function sapaPengguna(string $nama = null) {
echo "Halo, $nama\n";
}
sapaPengguna("Budi");Output yang Dihasilkan:
Deprecated: sapaPengguna(): Implicitly marking parameter $nama as nullable is deprecated, the explicit nullable type must be used instead in /home/z/my-project/php-course/content/php/error-handling/warnings-notices-dan-fatal-errors/.verify_tmp.php on line 2
Halo, BudiPerhatikan isi pesan Deprecated pada output di atas: pesan menyebut nama function sapaPengguna(), menjelaskan bahwa penandaan parameter $nama sebagai nullable secara implisit sudah usang, lalu memerintahkan penggunaan tipe nullable yang eksplisit. Eksekusi tetap berlanjut dan Halo, Budi tetap tercetak, karena Deprecated memang tidak fatal. Perbaikannya sesuai saran pesan — tulis tipe nullable secara eksplisit:
<?php
function sapaPengguna(?string $nama = null) {
echo "Halo, $nama\n";
}
sapaPengguna("Budi");
sapaPengguna();Output yang Dihasilkan:
Halo, Budi
Halo,Dengan tanda tanya pada ?string, niat “parameter ini boleh null” kini dinyatakan terbuka, Warning-style pesan hilang, dan kedua pemanggilan berjalan: sapaPengguna("Budi") mencetak Halo, Budi, sedangkan sapaPengguna() tanpa argumen memakai nilai bawaan null sehingga mencetak Halo, saja.
Fatal Error: Eksekusi Berhenti Total #
Fatal error adalah kategori paling keras: engine berhenti di titik kejadian, tidak ada baris lanjutan, dan exit code menjadi 255. Pemicu klasiknya adalah nama yang tidak dikenal — konstanta atau function. Berikut contoh konstanta yang lupa didefinisikan:
<?php
echo "Memuat status pesanan...\n";
$status = STATUS_AKTIF;
echo "Status: $status\n";Output yang Dihasilkan:
Memuat status pesanan...
Fatal error: Uncaught Error: Undefined constant "STATUS_AKTIF" in /home/z/my-project/php-course/content/php/error-handling/warnings-notices-dan-fatal-errors/.verify_tmp.php:3
Stack trace:
#0 {main}
thrown in /home/z/my-project/php-course/content/php/error-handling/warnings-notices-dan-fatal-errors/.verify_tmp.php on line 3Pada contoh di atas, baris 3 membaca konstanta STATUS_AKTIF yang tidak pernah didefinisikan dengan define() maupun keyword const. Di PHP 7 kejadian ini hanya berupa Notice dengan nilai string; di PHP 8 kejadian ini berubah menjadi Fatal error: Uncaught Error: Undefined constant "STATUS_AKTIF" — bukti nyata reclassification yang kita bahas di awal chapter. Pemicu kedua yang sama umumnya adalah salah ketik nama function:
<?php
echo "Menghitung diskon...\n";
$total = hitungDiskon(150000, 10);
echo "Total setelah diskon: $total\n";Output yang Dihasilkan:
Menghitung diskon...
Fatal error: Uncaught Error: Call to undefined function hitungDiskon() in /home/z/my-project/php-course/content/php/error-handling/warnings-notices-dan-fatal-errors/.verify_tmp.php:3
Stack trace:
#0 {main}
thrown in /home/z/my-project/php-course/content/php/error-handling/warnings-notices-dan-fatal-errors/.verify_tmp.php on line 3Kali ini engine tidak menemukan function bernama hitungDiskon() saat baris 3 dieksekusi, sehingga muncul Fatal error: Uncaught Error: Call to undefined function hitungDiskon() dan baris 4 tidak pernah dijalankan. Kabar baiknya, kata Uncaught Error memberi petunjuk penting: fatal error modern PHP berwujud object Error yang bisa ditangkap, sehingga program tidak selalu harus mati:
<?php
try {
$total = hitungDiskon(150000, 10);
} catch (Error $e) {
echo "Tertangkap: " . $e->getMessage() . "\n";
}
echo "Program berlanjut\n";Output yang Dihasilkan:
Tertangkap: Call to undefined function hitungDiskon()
Program berlanjutBlok try-catch pada contoh di atas menangkap object Error sebelum menjadi fatal, mencetak pesannya, lalu program tetap berlanjut ke baris terakhir. Mekanisme lengkap penangkapan semacam ini adalah materi chapter try-catch-finally
— untuk sekarang, cukup pahami bahwa kategori fatal di PHP 8 tidak lagi berarti kiamat yang tak terkendali.
Berkas contoh.php pada bagian bawah halaman merangkum seluruh contoh non-fatal di atas dalam satu program utuh yang dapat Anda unduh dan jalankan langsung.
Ringkasan #
Warning menandai masalah yang tidak menghentikan program — variabel dan array key yang tidak terdefinisi adalah pemicu terbanyaknya, dan operator ?? adalah obatnya. Deprecated mengingatkan pada fitur yang akan dihapus dan selalu membawa saran pengganti, seperti berubahnya string $x = null menjadi ?string $x = null. Fatal error menghentikan eksekusi dengan exit code 255, umumnya karena nama konstanta atau function yang tidak dikenal, namun berwujud object Error yang tetap bisa ditangkap. Ketiga label ini lahir dari mesin PHP; untuk kegagalan yang kita rancang sendiri berdasarkan aturan bisnis, PHP menyediakan exception — topik chapter berikutnya.
Referensi #
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
contoh.php
Unduh berkas<?php
// contoh.php — rangkuman contoh chapter "Warnings, Notices, dan Fatal Errors".
// Jalankan dengan: php contoh.php
$stok = ["apel" => 10, "jeruk" => 7];
echo "Stok jeruk: {$stok["jeruk"]}\n";
echo "Stok manggis: " . $stok["manggis"] . "\n";
echo "---\n";
echo "Stok manggis (dengan null coalescing): " . ($stok["manggis"] ?? 0) . "\n";
echo "---\n";
function sapaPengguna(?string $nama = null) {
echo "Halo, $nama\n";
}
sapaPengguna("Budi");
sapaPengguna();
echo "---\n";
try {
$total = hitungDiskon(150000, 10);
} catch (Error $e) {
echo "Tertangkap: " . $e->getMessage() . "\n";
}
echo "Program berlanjut\n";