مدیریت خطا/استثنا (PHP Exceptions)
استثناها (Exceptions): مدیریتِ هوشمندانهیِ بحران 🚨🛡️
در برنامهنویسیِ حرفهای، ما اجازه نمیدهیم برنامه با یک خطا کراش کند. در عوض، خطا را "میگیریم" و به شکلِ مناسبی آن را مدیریت میکنیم.
ساختارِ Try...Catch
کدی که ممکن است خطا بدهد را در try میگذاریم و در صورتِ بروزِ خطا، کنترل به بخشِ catch منتقل میشود.
پرتاب کردنِ خطا (Throw):
شما میتوانید در منطقِ برنامهیِ خودتان، هر جا که لازم بود یک خطا تولید کنید:
{code_block('if ($val < 0) { throw new Exception("مقدار نباید منفی باشد"); }')}بلاکِ Finally:
کدی که در finally قرار بگیرد، چه خطا رخ دهد و چه ندهد، در انتها اجرا خواهد شد (عالی برایِ بستنِ اتصالاتِ دیتابیس).
ساخت استثنایِ شخصی:
میتوانید کلاسی بسازید که از Exception ارثبری کند تا خطاهایِ اختصاصیِ خودتان (مثلاً PaymentException) را داشته باشید.
بخش تخصصی: مهندسی پیشرفته و امنیت در PHP 🐘⚙️
درکِ عمیقِ مفاهیمِ پیشرفته، تفاوتِ بینِ یک کدنویسِ معمولی و یک معمارِ نرمافزار را رقم میزند.
۱. بهینهسازی I/O و بافرینگ
در هنگامِ کار با فایلهایِ حجیم، هرگز کلِ فایل را به یکباره در حافظه (RAM) بارگذاری نکنید. استفاده از Streams و توابعِ fopen/fgets به شما اجازه میدهد فایل را خط به خط پردازش کنید که باعث میشود مصرفِ حافظه همیشه در کمترین سطحِ ممکن باقی بماند.
۲. امنیتِ نشستها (Session Security)
مهمترین خطر در مدیریتِ کاربران، Session Hijacking است. همیشه بعد از لاگین کردنِ کاربر، از session_regenerate_id(true) استفاده کنید تا شناسهیِ نشستِ قبلی باطل شود. همچنین فلگهایِ HttpOnly و Secure را برای کوکیها فعال کنید.
۳. استانداردهایِ مدرن و Autoloading
در پروژههایِ بزرگ، استفاده از include دستی فاجعهبار است. استانداردِ PSR-4 و استفاده از Composer به شما اجازه میدهد کلاسها را فقط در زمانی که واقعاً نیاز هستند بارگذاری کنید (Lazy Loading)، که سرعتِ لود شدنِ کلِ اپلیکیشن را به شدت بالا میبرد.
DateTime و PDO از این پارادایم استفاده میکنند.
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
ساختارِ try...catch را برای تابعی که ممکن است خطایِ Exception بدهد بنویسید و در بخشِ catch، پیغامِ خطا را با $e->getMessage() چاپ کنید.
<?php
try {
throw new Exception("Error occured");
} catch(Exception $e) {
echo $e->getMessage();
}
?>
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.