إعادة هيكلة الكود القديم بلغة PHP: دليل خطوة بخطوة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا إعادة هيكلة الكود القديم (Legacy Code) ليست رفاهية، بل ضرورة



كل مطور PHP يواجه عاجلاً أم آجلاً الكود القديم (Legacy Code). قد يكون مشروعاً كُتب قبل 10 سنوات على PHP 5.3، أو تطبيقاً "يعمل فقط"، لكنه يسبب الألم مع كل تغيير. إعادة هيكلة مثل هذا الكود ليست مجرد "تمشيط" للأسلوب، بل هي عملية بالغة الأهمية تعزز قابلية الصيانة والأداء وأمان التطبيق.



في هذه المقالة، سنستعرض الأساليب العملية لإعادة هيكلة كود PHP القديم (Legacy PHP Code)، باستخدام الإمكانيات الحديثة للغة (PHP 7.4–8.3) والأنماط (Patterns) المثبتة. ستتعلم كيفية إجراء التغييرات بأمان دون كسر النظام الحالي.



1. تقييم وتوثيق الحالة الحالية



الخطوة الأولى والأهم هي فهم ما تتعامل معه. لا تحاول إعادة الهيكلة بشكل أعمى.



1.1. إنشاء خريطة التبعيات (Dependency Map)

استخدم أدوات مثل PhpMetrics أو Deptrac لتصور العلاقات بين الكلاسات (Classes). سيساعدك هذا في اكتشاف "الكائنات الإلهية" (God Objects) والتبعيات الدائرية (Cyclic Dependencies).



// مثال على كلاس "إلهي" نموذجي في الكود القديمclass UserManager {    public function save($data) {        // 200 سطر من الكود: تحقق، إرسال بريد إلكتروني، تسجيل، العمل مع قاعدة البيانات    }        public function sendNewsletter() {        // 150 سطراً إضافياً    }        public function generateReport() {        // و100 سطر آخر    }}


1.2. كتابة اختبارات توصيفية (Characterization Tests)

قبل تغيير الكود، تأكد من توثيق السلوك الحالي بالاختبارات. استخدم نهج "السيد الذهبي" (Golden Master) أو اختبار اللقطة (Snapshot Testing):



// اختبار يثبت السلوك الحاليpublic function testLegacyCalculation(): void{    $calculator = new OldCalculator();    $result = $calculator->compute(10, 20);        // إذا لم تكن هناك مواصفات، فقط احفظ النتيجة    $this->assertSame(30, $result);}


نصيحة: إذا كان المشروع بلا اختبارات تماماً، ابدأ باختبارات التكامل (Integration Tests) للعمليات التجارية الحرجة. استخدم PHPUnit مع vfsStream لعزل نظام الملفات.



2. التحسين التدريجي: من الدوال العامة (Global Functions) إلى البرمجة كائنية التوجه (OOP)



جزء كبير من كود PHP القديم يتكون من دوال عامة وأسلوب إجرائي. الهجرة التدريجية إلى البرمجة كائنية التوجه (OOP) هي مرحلة أساسية في إعادة الهيكلة.



2.1. تغليف الدوال العامة (Encapsulation of Global Functions)

استبدل الدوال العامة بطرق (Methods) ثابتة في كلاس (Class)، ثم بخدمات (Services) كاملة.



// كان: دالة عامةfunction send_email($to, $subject, $message) {    mail($to, $subject, $message);}

// أصبح: كلاس خدمةclass MailService { public function __construct( private MailerInterface $mailer ) {} public function send(string $to, string $subject, string $message): bool { return $this->mailer->send($to, $subject, $message); }}


2.2. التخلص من المتغيرات العامة (Global Variables)

المتغيرات العامة ($GLOBALS, $_SESSION مباشرة) هي المصدر الرئيسي للأخطاء. استخدم نمط السجل (Registry Pattern) أو حقن التبعيات (Dependency Injection - DI).



// سيء: العمل المباشر مع المتغيرات العامةfunction getCurrentUser() {    global $db;    $id = $_SESSION['user_id'];    return $db->query("SELECT * FROM users WHERE id = $id");}

// جيد: حقن التبعيات بشكل صريحclass UserProvider { public function __construct( private PDO $db, private SessionInterface $session ) {} public function getCurrentUser(): ?User { $id = $this->session->get('user_id'); return $this->db->query('SELECT * FROM users WHERE id = ?', [$id]); }}


3. الاستبدال الآمن للبنى القديمة (Deprecated Constructs)



PHP في تطور مستمر، والعديد من البنى القديمة أصبحت غير آمنة و

المدونات

توصيات الكتب