البرمجة الوظيفية أم OOP في PHP: ماذا تختار في 2024؟

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

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

ابدأ الدورة

عالمين في لغة واحدة: لماذا هذا مهم؟

\n

عندما نتحدث عن PHP، يتبادر إلى الذهن فورًا المنهج الكائني التقليدي (OOP). الكلاسات، الوراثة، التغليف — هذه هي الأساسيات التي تُدرّس في جميع الدورات. ولكن هناك وجه آخر للعملة — المنهج الوظيفي. وهل تعلم؟ PHP تجيد كليهما، وبشكل جيد جدًا.

\n

في هذه المقالة، لن نتجادل حول أيهما أفضل. سنفهم متى وأي منهج يجب استخدامه لجعل كودك ليس فقط جميلًا، بل سريعًا أيضًا. إذا كنت تكتب بلغة PHP وتريد تجاوز حدود "مجرد أنه يعمل" — فهذا المقال لك.

\n\n

PHP كائني التوجه: الكلاسيكية التي لا تموت

\n

OOP في PHP يتعلق بالهيكلة وإعادة الاستخدام. تقوم بإنشاء كلاسات تصف كيانات تطبيقك: مستخدم، طلب، منتج. كل كلاس مسؤول عن مجال اختصاصه.

\n\n

مثال: العمل مع مستخدم باستخدام OOP

\n

لنلقِ نظرة على مثال نموذجي. لنفترض أننا بحاجة لإنشاء مستخدم وإرسال بريد ترحيبي إليه.

\n
<?php\nclass User {\n    private string $name;\n    private string $email;\n\n    public function __construct(string $name, string $email) {\n        $this->name = $name;\n        $this->email = $email;\n    }\n\n    public function sendWelcomeEmail(): void {\n        $subject = "مرحبًا بك، {$this->name}!";\n        $message = "أهلاً {$this->name}. يسعدنا رؤيتك في موقعنا.";\n        mail($this->email, $subject, $message);\n    }\n\n    public function getName(): string {\n        return $this->name;\n    }\n}\n\n$user = new User("إيفان", "ivan@example.com");\n$user->sendWelcomeEmail();\necho "تم إرسال البريد إلى المستخدم: " . $user->getName();\n?>
\n

كل شيء هنا منطقي: البيانات (الاسم، البريد الإلكتروني) والدوال (إرسال البريد) موجودة في مكان واحد. هذا مريح عندما يكون لديك العديد من العمليات المختلفة على كيان واحد.

\n\n

إيجابيات OOP في PHP

\n
    \n
  • قابلية القراءة: الكود مقسم إلى كتل منطقية، يسهل العثور على الدالة المطلوبة.
  • \n
  • الوراثة: يمكن إنشاء كلاس أساسي وتوسيعه.
  • \n
  • التغليف: البيانات محمية من التغيير العشوائي (private/protected).
  • \n
  • تعدد الأشكال: واجهة واحدة — تنفيذ مختلف.
  • \n
\n\n

سلبيات OOP

\n
    \n
  • الإفراط: لمهمة بسيطة (مثل تنسيق نص) كتابة كلاس يعتبر مبالغة.
  • \n
  • الحالة: الكائنات تخزن حالة، مما قد يؤدي إلى أخطاء إذا لم تتم مراقبة التغييرات.
  • \n
  • الذاكرة: كل كائن يستهلك ذاكرة أكثر من دالة بسيطة.
  • \n
\n\n

PHP وظيفي: البساطة والنقاء

\n

البرمجة الوظيفية في PHP ليست مجرد "كتابة دالة". إنها فلسفة حيث الدوال هي الأبطال الرئيسيون. ليس لها آثار جانبية، ولا تغير الحالة العامة، وتعيد دائمًا نتيجة متوقعة.

\n\n

مثال: نفس المهمة، ولكن بطريقة وظيفية

\n

لنحل نفس المهمة — إنشاء مستخدم وإرسال بريد — ولكن بدون كلاسات.

\n
<?php\nfunction createUser(string $name, string $email): array {\n    return ['name' => $name, 'email' => $email];\n}\n\nfunction sendWelcomeEmail(array $user): void {\n    $subject = "مرحبًا بك، {$user['name']}!";\n    $message = "أهلاً {$user['name']}. يسعدنا رؤيتك في موقعنا.";\n    mail($user['email'], $subject, $message);\n}\n\nfunction getUserName(array $user): string {\n    return $user['name'];\n}\n\n$user = createUser("إيفان", "ivan@example.com");\nsendWelcomeEmail($user);\necho "تم إرسال البريد إلى المستخدم: " . getUserName($user);\n?>
\n

يبدو أبسط؟ نعم. ولكن لا يوجد تغليف هنا — البيانات مجرد مصفوفة. لكن كل دالة تقوم بإجراء واحد فقط ولا تعرف شيئًا عن "العالم الخارجي".

\n\n

وظيفي متقدم

المدونات

توصيات الكتب