Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مقدمة إلى الواجهات

جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 27 من 91.

تحدد الواجهة (interface) عقداً يجب على الأصناف (classes) اتباعه. وعلى عكس الأصناف المجردة (abstract classes) التي يمكن أن تحتوي على دوال مجردة وملموسة معاً، فإن الواجهة تعلن فقط عن تواقيع الدوال (method signatures) دون أي تنفيذ. فكر فيها كأنها وعد: أي صنف يقوم بتنفيذ واجهة يضمن أنه سيوفر تلك الدوال المحددة.

تُعرّف الواجهة باستخدام الكلمة المفتاحية interface:

<?php
interface Printable {
    public function print();
}

تعلن هذه الواجهة أن أي فئة تقوم بتنفيذ Printable يجب أن تحتوي على دالة print(). لا تهتم الواجهة بكيفية عمل الدالة، بل تهتم فقط بوجودها.

إليك مثال بسيط يوضح الهيكل الأساسي:

<?php
interface Drivable {
    public function start();
    public function stop();
}

لاحظ أن أساليب الواجهة (interface methods) ليس لها جسم، بل مجرد التوقيع الذي ينتهي بفاصلة منقوطة. جميع الأساليب في الواجهة هي عامة (public) بشكل ضمني، لذا لا يمكنك استخدام private أو protected.

تعد الواجهات (Interfaces) قوية لأنها تسمح للفئات (classes) غير المرتبطة بمشاركة سلوك مشترك. قد لا يكون لـ Car و Motorcycle أي شيء مشترك من حيث الوراثة (inheritance)، ولكن يمكن لكليهما تنفيذ Drivable لضمان امتلاكهما لطريقتي (methods) start() و stop().

نقطة رئيسية: تحدد الواجهة (interface) ما هي الدوال (methods) التي يجب أن تمتلكها الفئة (class)، وليس كيفية عملها. فهي تضع عقداً يجب على الفئات المنفذة (implementing classes) الوفاء به.

challenge icon

التحدي

سهل

لنقم ببناء نظام رسائل بسيط يعرفك على الواجهات (interfaces). ستقوم بتعريف واجهة تضع عقداً لكيفية التعامل مع الرسائل، مما يضع الأساس للفئات المنفذة التي ستنشئها في الدرس القادم.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • Messageable.php — قم بتعريف واجهة تسمى Messageable تعلن عن توقيعين للدوال (method signatures): compose($content) لإنشاء رسالة، و deliver() لإرسالها. تذكر أن دوال الواجهة ليس لها جسم (body) — فقط التوقيع الذي ينتهي بفاصلة منقوطة.
  • main.php — قم بتضمين ملف Messageable. للتحقق من أن الواجهة الخاصة بك قد تم تعريفها بشكل صحيح، استخدم دالة interface_exists() في PHP للتحقق مما إذا كانت Messageable موجودة. ثم استخدم ReflectionClass لفحص الواجهة الخاصة بك وسرد دوالها. قم بإنشاء reflection لواجهتك، واحصل على دوالها باستخدام getMethods()، واطبع اسم كل دالة في سطر مستقل.

يجب أن يعرض مخرجك اسمي الدالتين اللتين تعلن عنهما واجهتك، كل منهما في سطر منفصل، بالترتيب الذي قمت بتعريفهما به.

يركز هذا التحدي تماماً على تعريف الواجهة — العقد الذي ستحتاج الفئات المستقبلية إلى الوفاء به. أنت تحدد الدوال التي يجب أن تكون موجودة، دون القلق بشأن كيفية عملها. هذا التنفيذ سيأتي في الدرس القادم!

ورقة مرجعية

تُحدد الواجهة (interface) عقداً يجب على الفئات (classes) اتباعه. فهي تعلن فقط عن تواقيع الدوال (method signatures) دون أي تنفيذ (implementation).

قم بتعريف واجهة باستخدام الكلمة المفتاحية interface:

<?php
interface Printable {
    public function print();
}

دوال الواجهة ليس لها جسم (body)، فقط التوقيع الذي ينتهي بفاصلة منقوطة. جميع الدوال في الواجهة تكون عامة (public) بشكل ضمني.

<?php
interface Drivable {
    public function start();
    public function stop();
}

تسمح الواجهات للفئات غير المرتبطة بمشاركة سلوك مشترك من خلال ضمان تنفيذها لدوال محددة.

جرّب بنفسك

<?php
// تضمين ملف واجهة Messageable
require_once 'Messageable.php';

// TODO: استخدم interface_exists() للتحقق مما إذا كانت واجهة Messageable موجودة

// TODO: قم بإنشاء كائن ReflectionClass لواجهة Messageable

// TODO: احصل على الطرق (methods) باستخدام getMethods()

// TODO: قم بالمرور عبر الطرق (methods) واطبع اسم كل طريقة في سطر منفصل

?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming