مقابلة PHP: من أين تبدأ لتنجح بدلاً من أن تفشل؟
\n\nلقد أرسلت سيرتك الذاتية، واجتزت مكالمة سريعة مع مسؤول الموارد البشرية، وها هي الدعوة لمقابلة تقنية. يبدأ قلبك بالخفقان: "ماذا لو سألوني عن شيء لا أعرفه؟"، "ماذا لو نسيت الصياغة؟"، "ماذا لو طلبوا مني كتابة كود على السبورة؟".
\n\nتلميح: على الأرجح سيطلبون منك ذلك. وهذا أمر طبيعي. مقابلة PHP ليست امتحانًا نظريًا، بل حوار. لكنه حوار يجب أن تستعد له. في هذا المقال، سنستعرض ما يُطرح فعليًا في مقابلات مطوري PHP في عام 2025، وما هي الأخطاء التي يقع فيها 90% من المرشحين، وكيف تظهر بأفضل صورة.
\n\nما المهم معرفته: هيكل التحضير
\n\nلجعل تحضيرك لمقابلة PHP منهجيًا، قسّمه إلى ثلاث مجموعات:
\n\n- \n
- أساسيات اللغة: أنواع البيانات، المصفوفات، الدوال، التعامل مع الملفات، الجلسات. \n
- البرمجة كائنية التوجه والهندسة المعمارية: الوراثة، التغليف، تعدد الأشكال، Traits، الواجهات. \n
- الأدوات والنظام البيئي: Composer، PSR، الأطر العمل، الاختبارات، SQL. \n
من أكثر الأسئلة شيوعًا في مقابلات PHP للمبتدئين هو الفرق بين == و ===. قد يبدو الأمر بسيطًا، لكن هذه التفاصيل الصغيرة هي ما يتعثر فيه حتى المطورون ذوو الخبرة.
مثال: المقارنة مع تحويل الأنواع
\n\n<?php\n// مقارنة غير صارمة\nvar_dump(0 == '0'); // true\nvar_dump(0 == false); // true\nvar_dump('' == false); // true\n\n// مقارنة صارمة\nvar_dump(0 === '0'); // false\nvar_dump(0 === false); // false\nvar_dump('' === false); // false\n?>\n\nلماذا هذا مهم؟ لأنه في المشاريع الحقيقية، قد تؤدي المقارنة غير الصارمة إلى أخطاء يصعب تتبعها. على سبيل المثال، عند التحقق من وجود قيمة في مصفوفة باستخدام in_array() دون المعامل الثالث true.
البرمجة كائنية التوجه في PHP: أكثر ما يُسأل عنه
\n\nفي مقابلات PHP للمستويين المتوسط والمتقدم، أسئلة OOP إلزامية. ولكن حتى المبتدئين يجب أن يكونوا مستعدين. إليك أهم 3 مواضيع:
\n\n1. Traits مقابل Interfaces مقابل Abstract Classes
\n\nكثيرون يخلطون بين متى يستخدمون Trait ومتى يستخدمون Interface. تذكر القاعدة البسيطة:
\n- \n
- Interface هو عقد. يلتزم الفصل بتنفيذ الدوال. \n
- Abstract Class هو تنفيذ جزئي + عقد. \n
- Trait هو مجرد مجموعة من الدوال التي يمكن "لصقها" في أي فصل. \n
<?php\ninterface LoggerInterface {\n public function log(string $message): void;\n}\n\nabstract class AbstractLogger implements LoggerInterface {\n protected string $prefix;\n\n public function __construct(string $prefix) {\n $this->prefix = $prefix;\n }\n\n abstract public function formatMessage(string $message): string;\n}\n\ntrait TimestampTrait {\n public function getTimestamp(): string {\n return date('Y-m-d H:i:s');\n }\n}\n\nclass FileLogger extends AbstractLogger {\n use TimestampTrait;\n\n public function formatMessage(string $message): string {\n return $this->getTimestamp() . ' [' . $this->prefix . '] ' . $message;\n }\n\n public function log(string $message): void {\n file_put_contents('log.txt', $this->formatMessage($message) . PHP_EOL, FILE_APPEND);\n }\n}\n?>\n\n2. مبادئ SOLID
\n\nهذه ليست مجرد اختصار. يحب المحاورون أن يسألوا: "أعط مثالاً على انتهاك مبدأ استبدال ليسكوف (LSP)". المثال الأكثر وضوحًا هو الكلاسيكي "المربع يرث من المستطيل".
\n\n<?php\n// انتهاك LSP\nclass Rectangle {\n public function __construct(protected int $width, protected int $height) {}\n public function setWidth(int $width): void { $this->width = $width; }\n public function setHeight(int $height): void { $this->height = $height; }\n public function getArea(): int { return $this