مبادئ SOLID في PHP: دليل شامل مع أمثلة برمجية

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

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

ابدأ الدورة

مقدمة: لماذا تعتبر مبادئ SOLID أساس كتابة كود PHP عالي الجودة

\n\n

يواجه كل مطور PHP عاجلاً أم آجلاً مشكلة "كود السباغيتي": حيث تصبح الفئات مثقلة، وتؤدي التغييرات في مكان واحد إلى تعطيل التطبيق بأكمله، ويتحول الاختبار إلى كابوس. الحل لهذه المشكلة هو مبادئ SOLID. طورها روبرت مارتن (العم بوب)، وهذه المبادئ الخمسة للبرمجة كائنية التوجه تساعد في إنشاء كود مرن وقابل للصيانة والتوسع.

\n\n

في هذه المقالة، سنشرح كل مبدأ من مبادئ SOLID الخمسة بأمثلة عملية بلغة PHP. ستتعلم كيفية تطبيقها في المشاريع الحقيقية، وسترى الفرق بين الكود "السيء" والكود "الجيد". المحتوى مناسب للمبتدئين والمطورين ذوي الخبرة الذين يرغبون في تنظيم معرفتهم.

\n\n

1. مبدأ المسؤولية الواحدة (SRP)

\n\n

جوهر المبدأ

\n

يجب أن يكون للفئة سبب واحد فقط للتغيير. وهذا يعني أن كل وحدة أو فئة مسؤولة عن مهمة واحدة محددة.

\n\n

مثال سيء (انتهاك SRP)

\n
<?php\nclass Report {\n    public function generateReport($data) {\n        // تكوين بيانات التقرير\n        $report = "التقرير: " . json_encode($data);\n\n        // الحفظ في ملف\n        file_put_contents('report.txt', $report);\n\n        // الإرسال عبر البريد الإلكتروني\n        mail('admin@example.com', 'تقرير جديد', $report);\n\n        return $report;\n    }\n}\n?>
\n

هنا، تقوم الفئة Report بثلاث مهام مختلفة: إنشاء التقرير، حفظه، وإرساله. تغيير منطق إرسال البريد الإلكتروني سيعطل إنشاء التقرير.

\n\n

مثال جيد (الالتزام بـ SRP)

\n
<?php\nclass ReportGenerator {\n    public function generate(array $data): string {\n        return "التقرير: " . json_encode($data);\n    }\n}\n\nclass ReportSaver {\n    public function save(string $report, string $filename): void {\n        file_put_contents($filename, $report);\n    }\n}\n\nclass ReportMailer {\n    public function send(string $report, string $email): void {\n        mail($email, 'تقرير جديد', $report);\n    }\n}\n\n// الاستخدام\n$generator = new ReportGenerator();\n$report = $generator->generate($data);\n\n$saver = new ReportSaver();\n$saver->save($report, 'report.txt');\n\n$mailer = new ReportMailer();\n$mailer->send($report, 'admin@example.com');\n?>
\n

الآن، لكل فئة مسؤولية واحدة، وتغيير طريقة الحفظ لن يؤثر على إرسال البريد الإلكتروني.

\n\n

2. مبدأ الفتح/الإغلاق (OCP)

\n\n

جوهر المبدأ

\n

يجب أن تكون الكيانات البرمجية مفتوحة للتمديد ولكن مغلقة للتعديل. بمعنى آخر، يجب أن تكون قادراً على إضافة وظائف جديدة دون تغيير الكود الموجود.

\n\n

مثال سيء (انتهاك OCP)

\n
<?php\nclass PaymentProcessor {\n    public function process($type, $amount) {\n        if ($type === 'credit_card') {\n            // معالجة بطاقة الائتمان\n        } elseif ($type === 'paypal') {\n            // معالجة PayPal\n        } elseif ($type === 'bitcoin') {\n            // معالجة Bitcoin\n        }\n        // كل نوع دفع جديد يتطلب تغيير هذه الدالة!\n    }\n}\n?>
\n\n

مثال جيد (الالتزام بـ OCP)

\n
<?php\ninterface PaymentMethod {\n    public function process(float $amount): bool;\n}\n\nclass CreditCardPayment implements PaymentMethod {\n    public function process(float $amount): bool {\n        // منطق الدفع ببطاقة الائتمان\n        echo "الدفع بالبطاقة: $amount\\n";\n        return true;\n    }\n}\n\nclass PayPalPayment implements PaymentMethod {\n    public function process(float $amount): bool {\n        // منطق الدفع عبر PayPal\n        echo "الدفع عبر PayPal: $amount\\n";\n        return true;\n    }\n}\n\nclass BitcoinPayment implements PaymentMethod {\n    public function process(float $amount): b                

المدونات

توصيات الكتب