أنماط التصميم في PHP: من الأساسيات إلى التقنيات المتقدمة
أنماط التصميم (design patterns) هي حلول مجربة ومتكررة للمشكلات النمطية التي تنشأ أثناء تطوير البرمجيات. بالنسبة لمطور PHP، فإن معرفة الأنماط ليست مجرد علامة في السيرة الذاتية، بل هي أداة حقيقية لإنشاء كود مرن وقابل للصيانة والتوسع. في هذه المقالة، سنستعرض ثلاث مجموعات رئيسية من أنماط GoF (عصابة الأربعة) مع أمثلة محددة بلغة PHP، يمكنك تطبيقها فورًا في مشاريعك.
1. أنماط الإنشاء (Creational Patterns)
هذه الأنماط مسؤولة عن إنشاء الكائنات، حيث تخفي منطق التثبيت وتجعل النظام مستقلاً عن طريقة إنشاء الكائنات وتكوينها.
Singleton (المفرد)
يضمن أن يكون للفصل مثيل واحد فقط، ويوفر نقطة وصول عالمية إليه. مثال كلاسيكي هو الاتصال بقاعدة البيانات.
<?phpclass Database { private static ?Database $instance = null; private PDO $pdo;
private function __construct() { $this->pdo = new PDO('mysql:host=localhost;dbname=test', 'root', ''); }
public static function getInstance(): Database { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; }
public function query(string $sql): array { // منطق تنفيذ الاستعلام return $this->pdo->query($sql)->fetchAll(); }
// منع الاستنساخ وإلغاء التسلسل private function __clone() {} public function __wakeup() { throw new Exception("Cannot unserialize singleton"); }}
// الاستخدام$db = Database::getInstance();$results = $db->query("SELECT * FROM users");?>Factory Method (طريقة المصنع)
يحدد واجهة لإنشاء كائن، لكنه يسمح للفئات الفرعية بتغيير نوع الكائن الذي يتم إنشاؤه. مناسب تمامًا لإنشاء مجموعات من الكائنات المرتبطة.
<?phpinterface Logger { public function log(string $message): void;}
class FileLogger implements Logger { public function log(string $message): void { file_put_contents('app.log', $message . PHP_EOL, FILE_APPEND); }}
class DatabaseLogger implements Logger { public function log(string $message): void { // حفظ في قاعدة البيانات echo "Logged to DB: $message"; }}
abstract class LoggerFactory { abstract public function createLogger(): Logger;
public function logMessage(string $message): void { $logger = $this->createLogger(); $logger->log($message); }}
class FileLoggerFactory extends LoggerFactory { public function createLogger(): Logger { return new FileLogger(); }}
class DatabaseLoggerFactory extends LoggerFactory { public function createLogger(): Logger { return new DatabaseLogger(); }}
// الاستخدام$factory = new FileLoggerFactory();$factory->logMessage("هذه الرسالة ستُسجل في الملف");?>2. الأنماط الهيكلية (Structural Patterns)
تحدد هذه الأنماط كيف يمكن دمج الفئات والكائنات في هياكل أكبر، مع الحفاظ على المرونة والكفاءة.
Adapter (المهايئ)
يسمح للكائنات ذات الواجهات غير المتوافقة بالعمل معًا. يعمل المهايئ كغلاف يحول استدعاءات واجهة إلى أخرى.
<?php// فئة قديمة بواجهة غير مريحةclass OldPaymentSystem { public function processPayment(float $amount, string $currency): string { return "Processing $amount $currency via legacy system"; }}
// واجهة جديدة نريد استخدامهاinterface NewPaymentInterface { public function pay(float $amount): string;}
// المهايئclass PaymentAdapter implements NewPayme