آموزش انواع خطا در PHP با راه حل رفع خطاها

خطاها جزء جدایی‌ناپذیر برنامه‌نویسی در روند توسعه نرم‌افزار هستند! اما همان‌طور که می‌دانید این خطا یا Errorها مانع از عملکرد صحیح برنامه شده و ما به‌عنوان برنامه‌نویس باید آن‌ها را شناسایی و رفع کنیم. در این آموزش با ۴ نوع خطا در PHP آشنا شده و راه‌حل‌های پیشنهادی رفع خطاهای رایج را با هم بررسی می‌کنیم.

بعضی از خطاها باعث می‌شوند اجرای برنامه متوقف شود. معمولاً این نوع خطا خیلی راحت‌تر از سایر ارورها قابل تشخیص است. چون هنگام برنامه‌نویسی و تست برنامه، متوجه بروز آن‌ها شده و می‌توانیم برای رفع مشکل اقدام کنیم.

اما برخی از خطاها در هنگام اجرای برنامه هستند یا صرفاً از نظر منطقی باعث بروز مشکل می‌شوند. تشخیص این دو نوع کمی سخت‌تر است.

چه خطاهایی داریم؟

اگر بخواهم انواع خطا در PHP را دسته‌بندی کنم، به‌طور کلی ۳ دسته‌بندی خواهیم داشت:

  1. خطاهای نحوی (Syntax Errors): این خطاها زمانی رخ می‌دهند که قواعد نگارشی زبان PHP به‌درستی رعایت نشده باشند. این نوع خطاها معمولاً در زمان نوشتن کد ایجاد شده و مفسر نمی‌تواند آن‌ها را تفسیر کند. این خطاها باعث توقف اجرای برنامه می‌شوند. در بخش بعدی مثال این مورد درون کد را می‌بینیم.
  2. خطاهای اجرایی (Runtime Errors): خطای اجرایی در هنگام اجرای برنامه رخ می‌دهد. برخورد با چنین خطایی دلایل مختلفی می‌تواند داشته باشد؛ برای مثال، فایل مورد نظر در آدرسی که انتظار داشتیم وجود نداشته باشد یا RAM (حافظه موقت سیستم) ظرفیت کافی برای اجرای برنامه نداشته باشد. در این حالت، کدها کاملاً درست نوشته شده‌اند اما شرایطی در زمان اجرا باعث ایجاد خطا می‌شوند.
  3. خطاهای منطقی (Logical Errors): خطای منطقی ناشی از اشتباه در منطق برنامه‌نویسی هستند. مثلاً فرض کنید در جایی باید دو عدد را با هم جمع می‌کردیم اما به اشتباه ضرب کرده‌ایم! در این حالت، برنامه بدون خطا اجرا می‌شوند اما نتیجهٔ نادرستی از آن می‌گیریم. تشخیص این خطاها کمی سخت است زیرا PHP به‌طور مستقیم به آن‌ها اشاره نمی‌کند و می‌بایست خودمان کد را بررسی کرده و مشکل را پیدا کنیم.

انواع خطای PHP

در ادامه چهار نوع خطای اصلی که در PHP وجود دارد را با هم بررسی کرده و راه‌حل‌های رفع آن‌ها را آموزش می‌بینیم. این آموزش یکی از جلسات تکمیلی دوره آموزش PHP است.

خطای نحوی (Syntax Error و Parse Error)

خطاها نحوی به دلیل اشتباه نگارشی (syntaxـی) در کد ایجاد می‌شوند و معمولاً باعث توقف اجرای برنامه خواهند شد. فرض کنید در زبان محاوره رسمی ما انتظار داریم یک جمله حتماً دارای فعل باشد. حال اگر کسی به ما فقط بگوید «این کتاب را»، ما منتظریم جمله‌اش تکمیل شود وگرنه آن را ناقص در نظر می‌گیریم.

اکثر این خطاها به ۳ دلیل رایج رخ می‌دهند:

  • کروشه، "، ' یا ; اضافی یا ناکافی
  • غلط املایی در نوشتن کلمات کلیدی
  • عدم رعایت قوانین نام‌گذاری در نام متغیر یا تابع

در قطعه کد زیر، بعد از دستور echo علامت سمی‌کالن (;) را نگذاشته‌ام و همین مورد موجب بروز خطای syntax در اجرای برنامه PHP می‌شود.

<?php
 $site = "SabzDanesh.com";
 echo $site
 echo "Welcome to " . $site
مثال خطای Syntax Error و راهنمای آن
مثال خطای Syntax Error و راهنمای آن

در قطعه کد زیر یک بلوک شرط PHP نوشته شده است؛ اما اگر دقت کنید با وجود اینکه کدهای ما به پایان رسیده اما بلوک شرط به انتها نرسیده است. یعنی علامت { در انتهای بلوک شرطی فراموش شده است.

<?php
 $score = 16;
 if($score > 12){
     echo "You passed the course!";
نمونه خطای Parse Error در PHP و متن آن
نمونه خطای Parse Error در PHP و متن آن

راه‌حل رفع خطای syntax

برای رفع خطاهای نحوی، باید کدهایی که نوشته‌ایم را بررسی کنیم. البته وقتی برنامه را اجرا می‌کنیم، در اکثر موارد خودِ PHP تلاش می‌کند مشکلی که موجب خطا شده است را به ما اطلاع دهد. (مانند تصویر خطای بالا)

دقت کنید که ممکن است شماره خطی که در پیغام خطا نوشته شده باشد دقیقاً همان خطی نباشد که دارای مشکل است. مفسر PHP محلی که برایش نامفهوم است را مشخص می‌کند. گاهی مشکل مورد نظر در چند خط قبل‌تر وجود دارد.

یکی از بهترین روش‌ها برای جلوگیری از بروز خطاهای نحوی، استفاده از ویرایشگر (IDE) هایی است که به‌طور خودکار خطاهای نگارشی را شناسایی کرده و برای شما مشخص می‌کنند.

خطای Fatal Error در PHP

خطای Fatal که به فارسی ممکن است خطای مرگبار یا خطای کُشنده هم گفته شود، یک خطای بحرانی است و باعث توقف برنامه می‌شود. این خطا هنگامی رخ می‌دهد که در حال تلاش برای فراخوانی فایل ناموجود باشیم (با require)، یا تابع و کلاسی که وجود ندارند را فراخوانی و استفاده کنیم. همچنین اگر مشکل حیاتی در اجرای یک دستور پیش بیاید با این خطا مواجه خواهیم شد. برای مثال، اگر اشتباهاً عددی بر صفر تقسیم شود.

در کد زیر تابع undefined() را فراخوانی کرده‌ام در حالی که چنین تابعی تعریف نشده است:

<?php
 undefined();
آموزش تابع در PHP و ترفندهای کار با Function

آموزش تابع در PHP و ترفندهای کار با Function

به‌طور مشابه، در کد زیر تلاش شده که یک شیء از کلاس Tutorial ساخته شود در حالی که این کلاس در برنامه تعریف نشده است. وقتی اجرای کد ما به این خط برسد، خطای fatal error در PHP رخ خواهد داد.

<?php
 $obj = new Tutorial();
آموزش کلاس در PHP و کار با متد و ویژگی

آموزش کلاس در PHP و کار با متد و ویژگی

رفع خطای fatal error

برای جلوگیری از بروز خطاهای Fatal، باید مطمئن شویم که توابع و کلاس‌ها قبل از استفاده تعریف شده باشند. همچنین فایل‌هایی که قرار است require شوند دقیقاً در همان مسیری که انتظار داریم قرار گرفته باشند.

مشابه خطاهای نحوی، برخی از IDEهای PHP نیز تلاش می‌کنند این‌گونه مشکلات را شناسایی کرده و اطلاع دهند.

در برنامه‌های بزرگ یا کدهایی که به‌صورت پلاگین/افزونه برای یک سیستم بزرگ‌تر نوشته می‌شوند، می‌توانیم از توابعی نظیر class_existx() و function_exists() استفاده کنیم. یعنی در یک شرط، ابتدا بررسی می‌کنیم اگر فلان تابع وجود داشت آن را فراخوانی کن.

خطای هشدار یا Warning Error

خطای warning در PHP معمولاً خطاهای غیر جدی هستند که اجرای برنامه را متوقف نمی‌کنند اما ممکن است باعث مشکلاتی در عملکرد آن شوند. این نوع خطاها در اسکریپت به ما اطلاع داده می‌شوند اما برنامه همچنان ادامه می‌یابد.

در قطعه کد زیر، تلاش شده تا فایلی که وجود ندارد درون برنامه include شود. همان‌طور که از بحث include و require در PHP می‌دانید، دستور include فقط تلاش می‌کرد فایل مورد نظر را فراخوانی کند. اگر این فایل وجود نداشته باشد، در خروجی اجرای برنامه به ما اطلاع داده و سایر خطوط را اجرا می‌کند.

<?php
 include "nonexistentfile.php";
 echo "SabzDanesh.com";

اگر کد بالا را اجرا کنم، خروجی زیر را خواهیم داشت. می‌بینید که یک خطای warning به ما داده شده اما برنامه متوقف نشده و دستور echo نیز اجرا شده است.

مثال خروجی خطای Warning Error با PHP
مثال خروجی خطای Warning Error با PHP

معمولاً چهار مشکل زیر موجب خطای Warning در PHP می‌شوند:

  • include کردن فایل‌هایی که وجود ندارند (یا آدرس آن‌ها اشتباه است)
  • استفاده از توابع منسوخ‌شده (deprecated)
  • اجرای کوئری‌های SQL اشتباه
  • ارسال پارامترهای اشتباه به تابع

راهکار رفع خطای warning

برای جلوگیری از خطاهای warning در PHP باید از وجود فایل‌ها و متغیرها اطمینان حاصل کنیم. با وجود اینکه این خطاها موجب توقف اجرای اسکریپت نمی‌شوند، اما در اکثر موارد موجب نقص در عملکرد صحیح آن خواهند شد.

در برنامه‌های بزرگ یا کدهایی که به‌صورت پلاگین/افزونه برای یک سیستم بزرگ‌تر نوشته می‌شوند، می‌توانیم از توابع file_exists() و برای بررسی وجود فایل‌ها پیش از فراخوانی آن‌ها استفاده کنیم.

خطای Notice Error در PHP

خطای اطلاع‌رسانی در PHP نشان‌دهنده مشکلات جزئی در کد هستند و معمولاً تأثیری بر عملکرد برنامه ندارند. این خطاها به‌ندرت باعث توقف اجرای برنامه شده و بیشتر به‌عنوان هشداری برای برنامه‌نویس عمل می‌کند. معمولاً دو نوع خطای زیر از نوع خطای Notice در PHP هستند:

  • فراخوانی متغیر/ثابت تعریف نشده
  • دسترسی به اندیسِ تعریف‌نشده از آرایه

برای مثال، در قطعه کد زیر، یک آرایه داریم و سعی شده به اندیس شماره 5 (که وجود ندارد) دسترسی داشته باشیم. در این حالت، یک خطا در صفحه سایت نمایش داده شده اما ادامهٔ کدها نیز اجرا می‌شوند.

<?php
 $names = ["Fateme", "Omid", "Hamed", "Sara"];
 echo $names[5];

اکثراً این نوع خطا با همان نام Warning در هنگام اجرای کد نمایش داده می‌شود. یعنی در متن خطا، Warning: ... دیده می‌شود.

چگونگی رفع خطای Notice

برای رفع این نوع خطاها، لازم است دلیل آن را پیدا کرده و اقدام به رفع آن کنید. مثلاً اگر متغیری که تعریف نشده را فراخوانی کرده‌اید، ابتدا آن را تعریف کنید. همچنین اگر اشتباهاً به اندیس ناموجود دسترسی داشته‌اید، آن را اصلاح کنید.

برای جلوگیری از چنین مشکلاتی، بعضاً می‌توانیم از تابع isset() برای بررسی وجود یک متغیر PHP یا اندیس خاص در آرایه استفاده کنیم.

ثابت‌های خطا در PHP

PHP برای دسته‌بندی خطاها از ثابت‌های از پیش تعریف‌شده‌ای استفاده می‌کند. این ثابت‌ها به شما کمک می‌کنند تا نوع خطا را در هنگام اجرای برنامه شناسایی و مدیریت کنید. ثابت‌های مربوط به چهار نوع خطایی که در این آموزش بررسی کردیم عبارت‌اند از:

  • E_PARSE: خطاهای syntax و parse
  • E_ERROR: نوع خطاهای Fatal (که منجر به توقف برنامه می‌شوند)
  • E_WARNING: هشدارها (که برنامه را متوقف نمی‌کردند)
  • E_NOTICE: اطلاع‌رسانی‌ها (که معمولاً مشکلاتی جزئی را مشخص می‌کردند)

برای مدیریت گزارش خطا می‌توانیم از دستورهای display_errors و error_reporting استفاده کنیم. به این‌صورت که مشخص می‌کنیم در هنگام اجرای برنامه، کدام نوع خطاها را نمایش دهد و کدام‌ها را نه. لیست تمام ثابت‌ها را می‌توانید در صفحه مستندات آن مشاهده کنید.

معمولاً خطاهای Warning و Notice در حالت production (اسکریپت در حال اجرای روی سایتی که کاربر با آن کار می‌کند) را غیرفعال می‌کنیم و آن‌ها فقط در هنگام توسعه و کدنویسی قابل نمایش می‌گذاریم.

برای آشنایی با مدیریت گزارش خطا، آموزش زیر را ببینید:

مدیریت گزارش خطا در PHP

مدیریت گزارش خطا در PHP

خلاصه خطاهای پی اچ پی

در این آموزش چهار نوع اصلی خطا در PHP را بررسی کردیم. خطاهای Syntax یا Parse به دلیل وجود مشکل در قواعد نگارشی زبان رخ می‌دهند. خطاهای Fatal هنگامی که مشکلاتی اساسی نظیر فراخوانی اجباری فایلی که وجود ندارد یا تقسیم‌بر صفر رخ می‌دهند. این دو نوع خطا باعث توقف اجرای برنامه در خطی که دارای مشکل است می‌شوند.

خطاهای Warning و Notice جزء خطاهای غیر حیاتی بوده و جهت اطلاع برنامه‌نویس نمایش داده می‌شوند تا مشکلات اصلاح شوند؛ اما اجرای کد متوقف نخواهد شد.

در مجموع، پیشنهاد می‌شود از ویرایشگرهای حرفه‌ای در توسعه برنامه‌های بزرگ استفاده کنید تا بخشی از این خطاها را پیش از آنکه اتفاق بیاُفتند به شما اطلاع دهند. مدیریت مناسب خطاها نیز می‌تواند باعث بهبود تجربه کاربری و عملکرد بهتر برنامه تحت وب شما شود. برای یادگیری نحوه مدیریت خطاها ناخواسته، جلسه آموزش مدیریت استثناء در PHP از دوره آموزش PHP را ببینید.