ไม่ว่าเราจะระมัดระวังในการเขียนโปรแกรมแค่ไหน ข้อผิดพลาดก็หลีกเลี่ยงไม่ได้ ข้อผิดพลาดเหล่านี้มักสร้างความสับสนให้กับคอมไพเลอร์ PHP ข้อความแสดงข้อผิดพลาดของคอมไพเลอร์ไม่เพียงแต่ไม่มีประโยชน์ แต่ยังทำให้หงุดหงิดหากนักพัฒนาไม่เข้าใจความหมาย
เมื่อคอมไพล์สคริปต์ PHP คอมไพเลอร์ PHP พยายามอย่างดีที่สุดในการรายงานปัญหาแรกที่พบ สิ่งนี้ทำให้เกิดปัญหา: PHP สามารถรับรู้ข้อผิดพลาดเมื่อมันเกิดขึ้นเท่านั้น (ปัญหานี้จะอธิบายโดยละเอียดในบทความนี้) ด้วยเหตุนี้เองที่คอมไพเลอร์ชี้ให้เห็นว่าบรรทัดที่มีข้อผิดพลาดอาจดูเหมือนมีความถูกต้องทางวากยสัมพันธ์บนพื้นผิว หรืออาจเป็นบรรทัดที่ไม่มีอยู่เลย!
ความเข้าใจข้อความแสดงข้อผิดพลาดที่ดีขึ้นสามารถลดเวลาที่ใช้ในการระบุและแก้ไขสิ่งที่ผิดได้อย่างมาก ดังนั้นในบทความนี้ ฉันจะพยายามชี้แจงข้อความแสดงข้อผิดพลาด PHP ประเภทต่างๆ มากมาย และวิธีทำความเข้าใจความหมายของข้อความแสดงข้อผิดพลาดต่างๆ อย่างถูกต้องในระหว่างกระบวนการพัฒนา
เนื้อหาที่อธิบายในบทความนี้ไม่เกี่ยวข้องกับเวอร์ชันของ PHP ที่คุณใช้ เนื่องจากข้อผิดพลาดต่างๆ ที่อธิบายในบทความนี้ไม่ได้จำกัดอยู่เพียงข้อผิดพลาดเฉพาะในเวอร์ชันใดเวอร์ชันหนึ่ง นอกจากนี้ เราถือว่าคุณเป็นโปรแกรมเมอร์รุ่นเยาว์หรือระดับกลางและมีส่วนร่วมในการเขียนโปรแกรมมาครึ่งปีหรือหนึ่งปี
วิธีการทำงานของคอมไพเลอร์
เพื่อทำความเข้าใจว่าเหตุใดคอมไพเลอร์จึงรายงานข้อผิดพลาดในบรรทัดใดบรรทัดหนึ่ง คุณต้องเข้าใจกลไกที่คอมไพเลอร์แยกวิเคราะห์โค้ด PHP ก่อน ฉันจะไม่ลงรายละเอียดเกี่ยวกับเรื่องนี้ในบทความนี้ แต่เราจะพูดถึงแนวคิดง่ายๆ บางประการที่มีแนวโน้มที่จะนำไปสู่ข้อผิดพลาด
การประกาศตัวแปร
หากคุณประกาศตัวแปรในคำสั่ง วิธีการเฉพาะจะเป็นดังนี้:
$variable = 'value';
คอมไพเลอร์จะค้นหาค่าของครึ่งทางขวาของคำสั่งก่อน (นั่นคือ ทุกอย่างที่อยู่ทางด้านขวาของค่าที่เท่ากัน เข้าสู่ระบบ). ในหนังสือการเขียนโปรแกรมบางเล่ม ข้อมูลนี้จะแสดงเป็น RHS (ครึ่งขวา) ของข้อความนี้ นี่เป็นส่วนหนึ่งของข้อความที่มักทำให้เกิดข้อผิดพลาด หากคุณใช้ไวยากรณ์ไม่ถูกต้อง คุณจะได้รับข้อผิดพลาดในการแยกวิเคราะห์
ข้อผิดพลาดในการแยกวิเคราะห์
: ข้อผิดพลาดในการแยกวิเคราะห์ T_WHILE ที่ไม่คาดคิดใน c:\program files\apache group\apache\htdocs\script.php ออนไลน์ 19
ข้อผิดพลาดในการแยกวิเคราะห์เกิดขึ้นทีละครั้งทุกครั้งที่มีการกำหนดข้อผิดพลาดก่อนหน้านี้ ให้ปรากฏต่อไป เนื่องจาก PHP หยุดรันสคริปต์หลังจากข้อผิดพลาดในการแยกวิเคราะห์ครั้งแรก การดีบักและแก้ไขข้อผิดพลาดชุดนี้มักจะเป็นเรื่องที่น่าเบื่ออย่างยิ่ง
นอกจากนี้ ข้อผิดพลาดในการแยกวิเคราะห์ยังมีข้อมูลน้อยมาก โดยแทบไม่มีการรายงานหมายเลขบรรทัดที่เกิดข้อผิดพลาด เหตุผลเฉพาะคือเมื่อมีข้อผิดพลาดเกิดขึ้น คอมไพเลอร์จะกำหนดว่าไวยากรณ์ของหลายบรรทัดควรดูถูกต้องจนกว่าจะพบไวยากรณ์ที่ไม่ถูกต้อง กรณีที่เป็นไปได้มากที่สุดคือมีการใช้คำที่กำหนดไว้ล่วงหน้าในนิพจน์ เช่น
while = 10 ; / Bad ? while เป็นคำที่กำหนดไว้ล่วงหน้าและไม่สามารถกำหนดให้กับค่าได้
เช่น while, function เป็นต้น หาก PHP ใช้ในการประเมินโค้ดของคุณ คุณจะไม่สามารถใช้คำที่กำหนดไว้ล่วงหน้าเหล่านี้เพื่อตั้งชื่อตัวแปรได้ นี่ PHP จะรายงานข้อผิดพลาดเพิ่มเติมซึ่งคุณทนไม่ได้
เกี่ยวกับปัญหานี้ ตัวอย่างต่อไปนี้อาจช่วยคุณได้ โปรดปรึกษาและอ่านโค้ด PHP ที่แสดงด้านล่าง:
<?php
$b = ค่าบางอย่าง
ถ้า($b == ค่าบางอย่าง){
พิมพ์ สวัสดีชาวโลก!;
-
?>
ข้อผิดพลาดอยู่ที่บรรทัด $b = (เครื่องหมายอัฒภาคหายไปที่ส่วนท้ายของคำสั่ง) ดังนั้นข้อผิดพลาดควรเป็นข้อผิดพลาดในการแยกวิเคราะห์: เครื่องหมายอัฒภาคหายไปในบรรทัดที่ 3 ใช่ไหม ไม่ควรพิจารณาตามตัวแยกวิเคราะห์:
ข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดในการแยกวิเคราะห์, T_IF ที่ไม่คาดคิดใน c:\program files\apache
group\apache\htdocs\ereg2.php ที่บรรทัด 4
ในบรรทัดที่ 4 ไวยากรณ์ของคำสั่ง if() ถูกต้อง ดังนั้นอะไรที่ทำให้คอมไพเลอร์สับสน? เบาะแสคือส่วนที่ไม่คาดคิดของ T_IF เมื่อเกิดข้อผิดพลาด T_??? ที่ไม่คาดคิด หมายความว่า: คอมไพเลอร์พบว่าคำที่กำหนดไว้ล่วงหน้าปรากฏในตำแหน่งที่ไม่ควรปรากฏ T_IF หมายถึง if(), T_WHILE หมายถึง while(), T_FOR หมายถึง for() ฯลฯ
โชคดีที่สาเหตุของข้อผิดพลาดบางอย่างก็เกิดขึ้นได้ง่ายเช่นกัน
กล่าวคือ คำสั่งไม่ได้ลงท้ายด้วยเครื่องหมายอัฒภาค (;) ดังตัวอย่างข้างต้น เครื่องหมายคำพูดหายไปในสตริง
ข้อผิดพลาดทั่วไปอื่นๆ
ข้อผิดพลาดที่พบบ่อยที่สุดที่ฉันเห็นคือเมื่อไม่ปิดฟังก์ชันหรือวนซ้ำด้วยเครื่องหมายปีกกา ( } ) นี่อาจเป็นข้อผิดพลาดที่พบบ่อยและน่ารำคาญที่สุด
รหัสเฉพาะมีดังนี้:
ฟังก์ชั่น UselessFunction() {
สำหรับ($i < 0; $i < 10; $i++){
}
ข้อผิดพลาดต่อไปนี้จะถูกสร้างขึ้น:
ข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดในการแยกวิเคราะห์ $ ที่ไม่คาดคิดใน c:\program files\apache
group\apache\htdocs\ereg2.php ที่บรรทัด 9
เนื่องจากฟังก์ชัน UselessFunction ไม่ได้ลงท้ายด้วยเครื่องหมายปีกกา (}) คอมไพเลอร์ PHP จึงมองหาเครื่องหมายปีกกาปิดจนกว่าจะถึงจุดสิ้นสุดของไฟล์ เนื่องจากคอมไพเลอร์ไม่พบวงเล็บปีกกาที่ตรงกัน จึงรายงานข้อผิดพลาดการสิ้นสุดไฟล์
หากลำดับชั้นของโค้ดสะท้อนให้เห็นอย่างถูกต้อง ข้อความแสดงข้อผิดพลาดจะชัดเจนมาก หากไม่ได้ทำเครื่องหมายโครงสร้างลำดับชั้นของรหัสก็แทบจะเป็นไปไม่ได้เลยที่จะค้นหาสิ่งที่ถูกลืมไปในที่สุด ดังนั้น อย่าลืมระบุลำดับชั้นของโค้ดของคุณ ปุ่ม Tab ทำให้สิ่งนี้ง่ายขึ้น นอกจากนี้ยังจะง่ายกว่าสำหรับนักพัฒนารายต่อๆ ไปที่จะเข้าใจโค้ดเฟรมเวิร์กและแก้ไขมัน
ข้อผิดพลาดของ MySQL
ข้อความแสดงข้อผิดพลาดที่น่ารำคาญอีกอย่างหนึ่งคือข้อผิดพลาด MySQL ที่พบบ่อยที่สุด ซึ่งมักจะทำให้เกิดอาการปวดหัวสำหรับผู้ใช้ PHP ใหม่: คำเตือน: อาร์กิวเมนต์ที่ให้มาไม่ใช่ทรัพยากรผลลัพธ์ MySQL ที่ถูกต้องใน...
บรรทัดที่มีข้อผิดพลาดที่รายงานข้างต้น อาจเป็น:
ในขณะที่ ($row = mysql_fetch_array($result)) {
พารามิเตอร์ $result ไม่ใช่ทรัพยากรที่ถูกต้อง ในภาษาอังกฤษหมายความว่า mysql_fetch_array ไม่สามารถประมวลผลได้เนื่องจากการสืบค้นล้มเหลว ไวยากรณ์ของแบบสอบถามใดไม่ถูกต้อง (คุณควรคัดลอกและวางแบบสอบถามลงในการอ้างอิงคอนโซล MySQL เพื่อทดสอบ) หรือการเชื่อมต่อกับฐานข้อมูลล้มเหลว (ในกรณีนี้คุณควรตรวจสอบชื่อผู้ใช้ รหัสผ่าน ฯลฯ อีกครั้ง)
การป้องกันข้อผิดพลาด
ในขั้นแรก smart coders สามารถทำตามขั้นตอนต่อไปนี้เพื่อกำจัดข้อผิดพลาดต่อไปนี้:
· อย่าคิดที่จะเพิ่มเครื่องหมายอัฒภาคที่ส่วนท้ายของทุกคำสั่ง - สิ่งนี้ควรกลายเป็นนิสัย
· ระบุลำดับชั้นของโค้ดของคุณเสมอทุกครั้งที่เป็นไปได้ ซึ่งจะช่วยให้คุณเห็นว่าคุณลืมใส่วงเล็บปีกกาที่ตำแหน่งต่างๆ เช่น หากเรียกใช้ หรือที่ส่วนท้ายของฟังก์ชัน
· โปรดใช้โปรแกรมแก้ไขที่มีการเน้นไวยากรณ์ (เช่น HTML-Kit) ด้วยความช่วยเหลือของโปรแกรมแก้ไขดังกล่าว คุณสามารถระบุได้ว่าคุณลืมใส่เครื่องหมายคำพูด หากไม่มีอัฒภาคหรือไม่ เป็นต้น
ในบทความ
นี้ เรามีความเข้าใจบางประการเกี่ยวกับข้อผิดพลาดที่ดูเหมือนไม่มีความหมายซึ่งคอมไพเลอร์ PHP สามารถรายงานได้ เราจำเป็นต้องใช้สิ่งที่เราเรียนรู้เพื่อหลีกเลี่ยงข้อผิดพลาดและวิธีแก้ไขเมื่อเกิดขึ้น การดีบักเป็นส่วนที่สำคัญที่สุดอย่างหนึ่งในงานของนักพัฒนา การปรับปรุงประสิทธิภาพการดีบักสามารถเร่งความคืบหน้าของงานทั้งหมดได้อย่างมาก และลดระยะเวลาที่ใช้ในการดำเนินโครงการให้เสร็จสิ้น นอกจากนี้ยังสามารถลดแรงกดดันทางจิตที่เกิดจากความล้มเหลวของโค้ดได้อย่างมาก