أنماط التصميم في PHP بمستوى متقدم: أمثلة برمجية

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

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

ابدأ الدورة

أنماط التصميم في PHP: مستوى متقدم

\n\n

أنماط التصميم (design patterns) هي حلول مثبتة للمشكلات النمطية التي تنشأ أثناء تطوير البرمجيات. على المستوى المبتدئ، يدرس المطورون Singleton أو Factory أو Adapter. ومع ذلك، في الأنظمة المعقدة أو عالية التحميل أو المرنة في PHP، هناك حاجة لأنماط أكثر قوة وتجريدًا. في هذه المقالة، سنشرح أربعة أنماط متقدمة مع أمثلة برمجية حقيقية في PHP: الإستراتيجية، طريقة المصنع، المراقب والحالة.

\n\n

1. نمط "الإستراتيجية" (Strategy)

\n\n

الغرض: يحدد مجموعة من الخوارزميات، ويغلف كل منها ويجعلها قابلة للتبادل. يسمح بتغيير سلوك الكائن أثناء وقت التشغيل دون تغيير كوده.

\n\n

مثال: نظام معالجة المدفوعات. لدينا عدة طرق للدفع: بطاقة ائتمان، PayPal، عملة رقمية. كل طريقة لها منطق التحقق والمعالجة الخاص بها.

\n\n
<?php\n\n// واجهة الإستراتيجية\ninterface PaymentStrategy\n{\n    public function pay(float $amount): void;\n    public function validate(): bool;\n}\n\n// إستراتيجيات محددة\nclass CreditCardPayment implements PaymentStrategy\n{\n    private string $cardNumber;\n    private string $cvv;\n\n    public function __construct(string $cardNumber, string $cvv)\n    {\n        $this->cardNumber = $cardNumber;\n        $this->cvv = $cvv;\n    }\n\n    public function validate(): bool\n    {\n        // التحقق البسيط من طول رقم البطاقة\n        return strlen($this->cardNumber) === 16 && strlen($this->cvv) === 3;\n    }\n\n    public function pay(float $amount): void\n    {\n        if (!$this->validate()) {\n            throw new \\InvalidArgumentException("بيانات البطاقة غير صحيحة");\n        }\n        echo "تم الدفع {$amount} عبر بطاقة الائتمان {$this->cardNumber}.<br>";\n    }\n}\n\nclass PayPalPayment implements PaymentStrategy\n{\n    private string $email;\n\n    public function __construct(string $email)\n    {\n        $this->email = $email;\n    }\n\n    public function validate(): bool\n    {\n        return filter_var($this->email, FILTER_VALIDATE_EMAIL) !== false;\n    }\n\n    public function pay(float $amount): void\n    {\n        if (!$this->validate()) {\n            throw new \\InvalidArgumentException("بريد إلكتروني PayPal غير صحيح");\n        }\n        echo "تم الدفع {$amount} عبر PayPal ({$this->email}).<br>";\n    }\n}\n\n// السياق (العميل)\nclass OrderProcessor\n{\n    private PaymentStrategy $strategy;\n\n    public function setPaymentStrategy(PaymentStrategy $strategy): void\n    {\n        $this->strategy = $strategy;\n    }\n\n    public function processOrder(float $total): void\n    {\n        if (!isset($this->strategy)) {\n            throw new \\RuntimeException("لم يتم اختيار طريقة الدفع");\n        }\n        $this->strategy->pay($total);\n    }\n}\n\n// الاستخدام\n$order = new OrderProcessor();\n$order->setPaymentStrategy(new CreditCardPayment('1234567812345678', '123'));\n$order->processOrder(150.00);\n// الإخراج: تم الدفع 150 عبر بطاقة الائتمان 1234567812345678.\n\n?>
\n\n

المزايا: سهولة إضافة خوارزميات جديدة (طرق دفع جديدة) دون تغيير الكود الموجود. يصبح الكود مرنًا وقابلًا للاختبار.

\n\n

2. نمط "طريقة المصنع" (Factory Method)

\n\n

الغرض: يحدد واجهة لإنشاء كائن، لكنه يسمح للفئات الفرعية بتغيير نوع الكائن الذي يتم إنشاؤه. هذا هو النمط الأساسي لجميع أنماط الإنشاء.

\n\n

مثال: إنشاء أنواع مختلفة من التقارير (PDF، HTML، JSON) بناءً على طلب المستخدم.

\n\n
<?php\n\n// المنتج المجرد\ninterface Report\n{\n    public function generate(): string;\n}\n\n// منتجات محددة\nclass PdfReport implements Report\n                

المدونات

توصيات الكتب