كيف تجتاز مقابلة PHP: أهم الأسئلة المتقدمة
\n\nمقابلة منصب مطور PHP خبير (Senior) هي اختبار ليس فقط للصياغة النحوية، بل أيضًا لعمق فهم الهندسة المعمارية والأداء والمعايير الحديثة. في هذه المقالة، سنحلل الأسئلة المتقدمة التي تُطرح غالبًا في المقابلات التقنية، وسنقدم إجابات مفصلة مع أمثلة كود. ستكون المقالة مفيدة سواء للتحضير للمقابلة أو لتطوير مهاراتك.
\n\n1. مبادئ SOLID في PHP: من النظرية إلى التطبيق
\n\nأحد أكثر مجموعات الأسئلة شيوعًا هو معرفة مبادئ SOLID والقدرة على تطبيقها. يريد المحاور أن يرى كيف تصمم بنية مرنة وقابلة للصيانة.
\n\nسؤال: "اشرح مبدأ الانفتاح/الإغلاق (OCP) بمثال على PHP."
\n\nالإجابة: يجب أن تكون الفئات مفتوحة للتمديد ولكن مغلقة للتعديل. بدلاً من تغيير الكود الموجود، نضيف كودًا جديدًا.
\n\nمثال على انتهاك مبدأ OCP:
\n<?php\nclass ReportGenerator {\n public function generate($type) {\n if ($type === 'pdf') {\n // إنشاء PDF\n } elseif ($type === 'csv') {\n // إنشاء CSV\n }\n }\n}\n\n\nالحل مع الالتزام بمبدأ OCP:
\n<?php\ninterface ReportInterface {\n public function generate(): string;\n}\n\nclass PdfReport implements ReportInterface {\n public function generate(): string {\n return 'محتوى PDF';\n }\n}\n\nclass CsvReport implements ReportInterface {\n public function generate(): string {\n return 'محتوى CSV';\n }\n}\n\nclass ReportGenerator {\n public function generate(ReportInterface $report): string {\n return $report->generate();\n }\n}\n\n\nهذا النهج يسمح بإضافة تنسيقات تقارير جديدة دون تغيير الكود الموجود لـ ReportGenerator.
2. أنماط التصميم: Singleton و Factory و Dependency Injection
\n\nمعرفة الأنماط هي شرط أساسي لمنصب الخبير (Senior). الأكثر شيوعًا هي Singleton و Factory و Dependency Injection.
\n\nسؤال: "قم بتنفيذ نمط Singleton في PHP واشرح متى يتم استخدامه."
\n\nالإجابة: يضمن Singleton أن يكون للفئة مثيل واحد فقط. يُستخدم للاتصال بقاعدة البيانات، أو مسجل الأحداث (Logger)، أو الإعدادات.
\n\n<?php\nclass Database {\n private static $instance = null;\n private $connection;\n\n private function __construct() {\n $this->connection = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');\n }\n\n public static function getInstance(): self {\n if (self::$instance === null) {\n self::$instance = new self();\n }\n return self::$instance;\n }\n\n public function getConnection(): PDO {\n return $this->connection;\n }\n\n // منع الاستنساخ وإلغاء التسلسل\n private function __clone() {}\n public function __wakeup() {\n throw new \\Exception("لا يمكن إلغاء تسلسل Singleton");\n }\n}\n\n// الاستخدام\n$db = Database::getInstance();\n\n\nسؤال: "ما هو Dependency Injection وكيف تنفذه بدون إطار عمل (Framework)؟"
\n\nالإجابة: DI هو تمرير التبعيات إلى الفئة عبر المُنشئ (Constructor) أو الدوال المساعدة (Setters)، بدلاً من إنشائها داخل الفئة.
\n\n<?php\nclass Logger {\n public function log(string $message): void {\n echo $message;\n }\n}\n\nclass UserService {\n private Logger $logger;\n\n // حقن التبعية عبر المُنشئ\n public function __construct(Logger $logger) {\n $this->logger = $logger;\n }\n\n public function createUser(array $data): void {\n // منطق إنشاء المستخدم\n $this->logger->log('تم إنشاء المستخدم');\n }\n}\n\n// الاستخدام\n$logger =