مبادئ SOLID في PHP: النظرية والتطبيق — دليل شامل

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

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

ابدأ الدورة

مبادئ SOLID في PHP: النظرية والتطبيق



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



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



الصياغة: يجب أن يكون للفصل (Class) سبب واحد فقط للتغيير. بمعنى آخر، كل فصل مسؤول عن مهمة أو وظيفة واحدة فقط.



غالبًا ما يؤدي انتهاك مبدأ SRP إلى "كائنات إلهية" تعرف وتفعل الكثير. لنلقِ نظرة على مثال سيء:



class Report {    public function generate($data) {        // إنشاء التقرير        return "التقرير: " . json_encode($data);    }

public function saveToFile($filename, $content) { file_put_contents($filename, $content); }

public function sendEmail($to, $subject, $body) { mail($to, $subject, $body); }}


هنا، الفصل Report مسؤول عن الإنشاء والحفظ والإرسال - ثلاث مسؤوليات مختلفة. دعنا نصلح ذلك:



class ReportGenerator {    public function generate($data) {        return "التقرير: " . json_encode($data);    }}

class FileSaver { public function save($filename, $content) { file_put_contents($filename, $content); }}

class EmailSender { public function send($to, $subject, $body) { mail($to, $subject, $body); }}

// الاستخدام$report = new ReportGenerator();$content = $report->generate($data);

$saver = new FileSaver();$saver->save('report.txt', $content);

$sender = new EmailSender();$sender->send('admin@example.com', 'التقرير جاهز', $content);


نصيحة عملية: إذا رأيت في اسم الفصل حرف العطف "و" (مثل UserAndLogger)، فهذه علامة أكيدة على انتهاك مبدأ SRP.



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



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



انتهاك مبدأ OCP يحدث عندما تتطلب إضافة نوع جديد تغيير الفصول الموجودة. مثال على كود سيء:



class PaymentProcessor {    public function process($type, $amount) {        if ($type === 'credit_card') {            // معالجة بطاقة الائتمان        } elseif ($type === 'paypal') {            // معالجة PayPal        } elseif ($type === 'crypto') {            // معالجة العملة الرقمية        }        // إضافة نوع جديد = تغيير هذا الفصل    }}


الحل هو استخدام تعدد الأشكال (Polymorphism) عبر الواجهات (Interfaces):



interface PaymentMethod {    public function process($amount);}

class CreditCardPayment implements PaymentMethod { public function process($amount) { echo "معالجة بطاقة الائتمان بمبلغ $amount"; }}

class PayPalPayment implements PaymentMethod { public function process($amount) { echo "معالجة PayPal بمبلغ $amount"; }}

class PaymentProcessor { public function process(PaymentMethod $method, $amount) { $method->process($amount); }}

// الاستخدام$processor = new PaymentProcessor();$processor->process(new CreditCardPayment(), 100);$processor->process(new PayPalPayment(), 200);


الآن، إضافة طريقة دفع جديدة (مثل ApplePayPayment) لا تتطلب تغيير PaymentProcessor.



3. مبدأ استبدال ليسكوف (Liskov Substitution Principle - LSP)



الصياغة: يجب أن تكون كائنات الفصول الفرعية قابلة للتبادل مع كائنات الفصل الأساسي

المدونات

توصيات الكتب