0Pricing
PHP Academy · บทเรียน

ชนิดและการรายงานข้อผิดพลาดใน 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_log
  • error_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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ชนิดและการรายงานข้อผิดพลาดใน PHP
  2. Try, Catch และ Finally
  3. การสร้างข้อยกเว้นแบบกำหนดเอง
  4. การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี
← กลับไปที่ PHP Academy