ชนิดและการรายงานข้อผิดพลาดใน PHP
ทำความเข้าใจประกาศเตือน คำเตือน และข้อผิดพลาดร้ายแรง รวมถึงระดับของ error_reporting
ชนิดและการรายงานข้อผิดพลาดใน PHP เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
ชนิดข้อผิดพลาดของ PHP
PHP มีระดับความรุนแรงของข้อผิดพลาดหลายระดับ:
- การแจ้งเตือน — ปัญหาเล็กน้อย การทำงานดำเนินต่อ
- คำเตือน — ปัญหาที่ไม่ร้ายแรง การทำงานดำเนินต่อ
- ข้อผิดพลาดร้ายแรง — การทำงานหยุดทันที
- ข้อผิดพลาดในการแยกวิเคราะห์ — ข้อผิดพลาดทางไวยากรณ์ หยุดก่อนเริ่มทำงาน
- เลิกใช้แล้ว — ฟีเจอร์นี้จะถูกนำออก
error_reporting()
ควบคุมว่าจะแจ้งข้อผิดพลาดรายการใดด้วย error_reporting():
<?php
// Show all errors (development)
error_reporting(E_ALL);
// Hide notices and deprecated
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
// Production: no display, log to file
error_reporting(E_ALL);
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', '/var/log/php_errors.log');display_errors เทียบกับ log_errors
การตั้งค่า php.ini ที่สำคัญสำหรับการจัดการข้อผิดพลาด:
display_errors = On— แสดงข้อผิดพลาดในเบราว์เซอร์ (ใช้เฉพาะการพัฒนา)display_errors = Off— ซ่อนข้อผิดพลาดจากผู้ใช้ (สภาพแวดล้อมจริง)log_errors = On— เขียนข้อผิดพลาดลงในไฟล์ error_logerror_log = /path/to/file— ระบุตำแหน่งจัดเก็บบันทึก
ห้ามแสดงข้อผิดพลาดแก่ผู้ใช้ในสภาพแวดล้อมจริงโดยเด็ดขาด!
การเรียกใช้ trigger_error เพื่อสร้างข้อผิดพลาด
สร้างข้อผิดพลาดของ PHP เองด้วย trigger_error():
<?php
function divide(int $a, int $b): float {
if ($b === 0) {
trigger_error('Division by zero', E_USER_WARNING);
return 0.0;
}
return $a / $b;
}
echo divide(10, 0); // triggers E_USER_WARNINGตัวจัดการข้อผิดพลาดแบบกำหนดเอง
ลงทะเบียนตัวจัดการข้อผิดพลาดของคุณเองด้วย set_error_handler():
<?php
set_error_handler(function(int $errno, string $errstr, string $file, int $line): bool {
$message = "[$errno] $errstr in $file:$line";
error_log($message);
if ($errno === E_USER_ERROR) {
http_response_code(500);
die('Internal error — please try again later');
}
return true; // don't execute PHP internal error handler
});
trigger_error('Custom error message', E_USER_ERROR);แหล่งที่มาทั่วไปของข้อผิดพลาด
สาเหตุทั่วไปของข้อผิดพลาดใน PHP:
- เข้าถึงคีย์อาร์เรย์ที่ไม่ได้กำหนด → การแจ้งเตือน
- เรียกใช้ฟังก์ชันที่ส่งคืนค่าเท็จ แล้วนำผลลัพธ์ไปใช้งาน → คำเตือน
- เรียกใช้ฟังก์ชันที่ไม่ได้กำหนด → ข้อผิดพลาดร้ายแรง
- ไม่มีเครื่องหมายอัฒภาค → ข้อผิดพลาดในการแยกวิเคราะห์
- หารด้วยศูนย์ → คำเตือน (ส่งคืน INF หรือ NAN)
ตัวดำเนินการระงับข้อผิดพลาด @
ตัวดำเนินการ @ ระงับข้อผิดพลาดจากนิพจน์เดียว — ควรหลีกเลี่ยงและใช้การจัดการข้อผิดพลาดที่เหมาะสม:
<?php
// Bad: hides errors silently
$result = @file_get_contents('missing.txt');
// Good: check explicitly
$result = file_get_contents('missing.txt');
if ($result === false) {
// handle the error
echo 'File not found';
}การคอมไพล์แบบทันเวลาใน PHP 8 และการเปลี่ยนแปลงเกี่ยวกับข้อผิดพลาด
PHP 8 ทำให้การจัดการข้อผิดพลาดเข้มงวดมากขึ้นในบางกรณี:
- คำเตือนจำนวนมากถูกยกระดับเป็น TypeError/ValueError
str_contains/starts_with/ends_withเข้ามาแทนที่นิพจน์ทั่วไปสำหรับการตรวจสอบแบบง่าย- การส่งอาร์กิวเมนต์ผิดชนิดจะทำให้เกิด TypeError โดยค่าเริ่มต้น
ini_set ขณะทำงาน
แทนที่การตั้งค่า php.ini ขณะโปรแกรมทำงาน:
<?php
// Display errors during development
if (getenv('APP_ENV') === 'development') {
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
} else {
ini_set('display_errors', '0');
ini_set('log_errors', '1');
error_reporting(E_ALL);
}การตรวจสอบระดับข้อผิดพลาด
ตรวจหาระดับข้อผิดพลาดด้วยการดำเนินการ AND ระดับบิต:
<?php
$level = error_reporting();
if ($level & E_NOTICE) {
echo 'Notices are reported';
}
if ($level & E_WARNING) {
echo 'Warnings are reported';
}
// Check specific error types
echo (E_ALL & E_NOTICE) ? 'E_ALL includes E_NOTICE' : 'no';แนวปฏิบัติที่ดีในการบันทึกข้อผิดพลาด
แนวทางที่ดีในการบันทึกข้อผิดพลาด:
- บันทึกข้อผิดพลาดในสภาพแวดล้อมจริงเสมอ
- ใส่บริบท ได้แก่ ID ผู้ใช้ URL ของคำขอ และเวลาประทับ
- ใช้การบันทึกแบบมีโครงสร้าง (JSON) เพื่อให้แยกวิเคราะห์ได้ง่ายขึ้น
- หมุนเวียนไฟล์บันทึกเพื่อป้องกันพื้นที่ดิสก์เต็ม
- ตรวจสอบบันทึกด้วยเครื่องมืออย่าง ELK, Datadog หรือ Papertrail
ตรวจสอบอย่างรวดเร็ว
ข้อผิดพลาดประเภทใดของ PHP ที่หยุดการทำงานทันที?
สรุป: การรายงานข้อผิดพลาด
สาระสำคัญของการจัดการข้อผิดพลาด:
- ประเภทข้อผิดพลาด: การแจ้งให้ทราบ คำเตือน ร้ายแรง การแยกวิเคราะห์ และเลิกใช้
- กำหนดระดับด้วย
error_reporting() - ปิดการแสดงผลและเปิดการบันทึกในสภาพแวดล้อมจริง
- ลงทะเบียนตัวจัดการแบบกำหนดเองด้วย
set_error_handler() - ห้ามใช้
@เพื่อระงับข้อผิดพลาดในโค้ดที่ใช้งานจริง
คำถามที่พบบ่อย
บทเรียน “ชนิดและการรายงานข้อผิดพลาดใน PHP” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ชนิดและการรายงานข้อผิดพลาดใน PHP” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ชนิดและการรายงานข้อผิดพลาดใน PHP”
ทำความเข้าใจประกาศเตือน คำเตือน และข้อผิดพลาดร้ายแรง รวมถึงระดับของ error_reporting คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ชนิดและการรายงานข้อผิดพลาดใน PHP” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม
ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ชนิดและการรายงานข้อผิดพลาดใน PHP
- Try, Catch และ Finally
- การสร้างข้อยกเว้นแบบกำหนดเอง
- การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี