كيف تجتاز مقابلة PHP: تحليل الأسئلة الأكثر شيوعاً
مقابلة مطور PHP ليست مجرد اختبار للصياغة (syntax)، بل هي اختبار لفهم البنية (architecture)، والأمان (security)، والمعايير الحديثة (PSR). في هذا المقال، جمعنا 10 أسئلة رئيسية تُطرح غالباً في مقابلات المستوى المبتدئ (Junior) والمتوسط (Middle). كل سؤال مصحوب بشرح، ومثال كود، والمزالق النموذجية.
1. ما الفرق بين echo و print؟ وما الفرق بين print_r و var_dump؟
هذا سؤال أساسي يختبر معرفة دوال الإخراج المضمنة.
echo— تركيب لغوي (language construct)، لا يُرجع قيمة. يعمل بشكل أسرع منprint.print— هو أيضاً تركيب، لكنه يُرجع دائماً1. يمكن استخدامه في التعبيرات.print_r— يُخرج معلومات قابلة للقراءة البشرية عن المتغير (مصفوفات، كائنات). يُرجع نصاً (string) إذا كانت المعامل الثانيtrue.var_dump— يُخرج نوع (type) وقيمة المتغير، بما في ذلك طول النص. مفيد لتصحيح الأخطاء (debugging).
<?php$arr = ['a' => 1, 'b' => 2];echo print_r($arr, true); // يُرجع نصاً، لا يخرجه فوراًvar_dump($arr); // array(2) { ["a"]=> int(1) ["b"]=> int(2) }?>2. ما هو التحميل التلقائي للكلاسات (Autoloading) وكيف يعمل مع Composer؟
التحميل التلقائي (autoloading) يسمح لـ PHP بتحميل الكلاسات تلقائياً عند أول استخدام لها، دون الحاجة إلى require_once صريح.
- سابقاً، كان يُستخدم الدالة
spl_autoload_register(). - الآن، المعيار الفعلي (de facto) هو Composer ومُحمّله التلقائي.
- يدعم Composer معيار PSR-4 (مساحات الأسماء) و PSR-0 (قديم).
// composer.json{ "autoload": { "psr-4": { "App\\\\": "src/" } }}
// بعد تنفيذ composer dump-autoload// الملف src/User.php مع namespace App;$user = new \\App\\User(); // سيتم تحميله تلقائياً3. الفرق بين include، require، include_once و require_once
سؤال لاختبار فهم التعامل مع الملفات الخارجية ومعالجة الأخطاء.
include— يُصدر تحذيراً (Warning) إذا لم يتم العثور على الملف، ويستمر السكريبت في العمل.require— يُصدر خطأ فادحاً (Fatal Error)، ويتوقف السكريبت.*_once— يتحقق مما إذا كان الملف قد تم تضمينه مسبقاً، ولا يضمّنه مرة أخرى.
المزلق: استخدام include داخل حلقة قد يؤدي إلى تضمين متكرر وحدوث خطأ في إعادة تعريف الدوال، إذا لم يتم استخدام include_once.
4. كيف يعمل PDO وما هي ميزاته على دوال mysql_*؟
PDO (PHP Data Objects) هي واجهة للتعامل مع قواعد البيانات. معرفتها إلزامية لأي مطور PHP حديث.
- يدعم أنظمة إدارة قواعد بيانات مختلفة (MySQL, PostgreSQL, SQLite) — فقط قم بتغيير DSN.
- يستخدم الاستعلامات المُحضّرة (prepared statements)، مما يحمي من هجمات SQL Injection.
- يوفر تعاملاً مريحاً مع المعاملات (transactions) ومعالجة الأخطاء عبر الاستثناءات (exceptions).
<?php$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';$pdo = new PDO($dsn, 'user', 'pass', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');$stmt->execute(['email' => $email]);$user = $stmt->fetch(PDO::FETCH_ASSOC);?>5. ما هي الدوال السحرية (Magic Methods) في PHP؟ أعط أمثلة
الدوال السحرية تبدأ بشرطة سفلية مزدوجة (__) ويتم استدعاؤها تلقائياً عند حدوث إجراءات معينة على الكائن.
__construct()— تُستدعى عند إنشاء الكائن.__get()/__set()— تُستدعيان عند الوصول إلى خصائص غير قابلة للوصول أو غير موجودة.__call()/__callStatic()— تُستدعيان عند استدعاء دوال غير قابلة للوصول أو غير موجودة.__toString()— تُستدعى عند محاولة معاملة الكائن كنص (string).
<?phpclass User { private array $data = [];
public function __get($name) { return $this->data[$name] ?? null; }
public function __set($name, $value) { $this->data[$name] = $value; }
public function __toString() { return $this->data['name'] ?? 'Guest'; }}
$user = new User();$user->name = 'Alice'; // يستدعي __setecho $user->name; // يستدعي __get، يطبع Aliceecho $user; // يستدعي __toString، يطبع Alice?>6. ما الفرق بين self و static و this؟
هذا السؤال يختبر فهم الربط المتأخر (Late Static Binding) في PHP.
$this— يشير إلى الكائن الحالي (instance). لا يمكن استخدامه داخل دالة ثابتة (static method).self— يشير إلى الكلاس الذي تم تعريف الخاصية أو الدالة فيه. لا يدعم تعدد الأشكال (polymorphism).static— يشير إلى الكلاس الذي تم استدعاء الدالة منه في وقت التشغيل (runtime). يدعم الربط المتأخر.
<?phpclass ParentClass { public static function who() { echo __CLASS__; }
public static function testSelf() { self::who(); // دائماً ParentClass }
public static function testStatic() { static::who(); // الربط المتأخر }}
class ChildClass extends ParentClass { public static function who() { echo __CLASS__; }}
ChildClass::testSelf(); // ParentClassChildClass::testStatic(); // ChildClass?>7. كيف تعمل الجلسات (Sessions) في PHP؟ وما الفرق بين Session و Cookie؟
الجلسات تسمح بتخزين بيانات المستخدم عبر عدة طلبات (requests). هذا سؤال أساسي في تطوير الويب.
- يتم تخزين بيانات الجلسة على الخادم (server-side). المتصفح يحمل فقط معرف الجلسة (Session ID) في Cookie.
- Cookies — تُخزن على جهاز العميل (client-side). يمكن تعطيلها من قبل المستخدم.
- الجلسات أكثر أماناً للبيانات الحساسة، لأنها لا تظهر للمستخدم مباشرة.
<?phpsession_start(); // بدء الجلسة أو استئنافها
$_SESSION['user_id'] = 42;$_SESSION['role'] = 'admin';
echo session_id(); // معرف الجلسة الفريد?>8. ما هو الـ Dependency Injection (DI) ولماذا هو مهم؟
حقن التبعيات (Dependency Injection) هو نمط تصميم (design pattern) يتم فيه تمرير تبعيات الكلاس من الخارج، بدلاً من إنشائها داخلياً.
- يجعل الكود أكثر قابلية للاختبار (testable) — يمكن استبدال التبعيات بسهولة بـ Mocks أثناء الاختبارات.
- يقلل من الاقتران (coupling) بين الكلاسات.
- يسهل صيانة الكود وتوسيعه.
<?phpinterface LoggerInterface { public function log(string $message): void;}
class FileLogger implements LoggerInterface { public function log(string $message): void { file_put_contents('app.log', $message . PHP_EOL, FILE_APPEND); }}
class UserController { public function __construct(private LoggerInterface $logger) {}
public function register(string $email): void { // منطق التسجيل... $this->logger->log("New user registered: $email"); }}
// الاستخدام$logger = new FileLogger();$controller = new UserController($logger); // DI?>9. كيف تتعامل مع الأخطاء والاستثناءات في PHP؟
PHP تدعم آليتين: معالجة الأخطاء التقليدية (error handling) والاستثناءات (exceptions). السؤال يختبر فهم الفرق بينهما.
- الأخطاء (Errors) — تحدث لمشاكل في وقت التشغيل (مثل استدعاء دالة غير موجودة). يمكن التعامل معها باستخدام
set_error_handler(). - الاستثناءات (Exceptions) — هي كائنات يتم رميها (thrown) عند حدوث حالة استثنائية. يتم التقاطها باستخدام
try...catch. - في PHP 7+، معظم الأخطاء أصبحت من نوع
Throwable، مما يسمح بالتقاطها باستخدامcatch (Throwable $e).
<?phptry { $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'wrong_pass'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);} catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage();} catch (Throwable $t) { echo 'Unexpected error: ' . $t->getMessage();} finally { echo 'This block always runs.';}?>10. ما هي معايير PSR ولماذا هي مهمة؟
PSR (PHP Standards Recommendations) هي توصيات صادرة عن PHP-FIG. اتباعها يجعل الكود متسقاً وقابلاً للقراءة من قبل مطورين آخرين.
- PSR-1 — المعايير الأساسية للصياغة (Basic Coding Standard).
- PSR-4 — التحميل التلقائي المعتمد على مساحات الأسماء (Autoloading Standard).
- PSR-7 — واجهات رسائل HTTP (HTTP Message Interfaces).
- PSR-12 — دليل أسلوب الكود الموسع (Extended Coding Style Guide).
نصيحة للمقابلة: اذكر أنك تستخدم أدوات مثل PHP_CodeSniffer و PHP-CS-Fixer لتطبيق PSR-12 تلقائياً في مشاريعك.