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

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

جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 27 من 91.

تحدد interface عقدًا يجب على الأصناف الالتزام به. بخلاف الأصناف المجرّدة التي يمكن أن تحتوي على كلٍّ من methods مجرّدة وملموسة، لا تعلن interface سوى عن تواقيع method دون أي تنفيذ. فكّر فيها باعتبارها وعدًا: فأي صنف ينفّذ interface يضمن أنه سيوفّر تلك methods المحددة.

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

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

يُعلن هذا interface أن أي فئة تطبّق Printable يجب أن have أسلوب print(). لا يهتم هذا interface بكيفية عمل method، بل يهتم فقط بأنّها exists.

إليك مثالًا بسيطًا يوضّح البنية الأساسية:

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

لاحظ أن interface methods لا تحتوي على body، just التوقيع المنتهي بـ semicolon. جميع methods في interface تكون public ضمنيًا، لذلك لا يمكنك استخدام private أو protected.

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

النقطة الأساسية: تحدد interface ما هي methods التي يجب أن have، وليس كيفية should عملها. فهي تنشئ عقدًا يجب على الأصناف المنفذة الوفاء به.

challenge icon

التحدي

سهل

لنَبْنِ نظام مراسلة بسيطًا يعرّفك على الواجهات. ستقوم بـ Define واجهة تنشئ عقدًا يحدد كيفية التعامل مع الرسائل، واضعًا الأساس للفئات المُنفِّذة التي ستنشئها في الدرس التالي.

ستنظّم شيفرتك عبر ملفين:

  • Messageable.php: قم بـ Define واجهة تُسمى Messageable وتُعلن عن توقيعَي method: compose($content) من أجل creating رسالة، وdeliver() من أجل sending إياها. Remember، لا تحتوي interface methods على body، بل على التوقيع فقط ending بفاصلة منقوطة.
  • main.php: Include ملف Messageable. للتحقق من أن interface الخاصة بك مُعرَّفة بشكل صحيح، استخدم دالة PHP‏ interface_exists() للتحقق مما إذا كانت Messageable exists. ثم استخدم ReflectionClass لفحص interface الخاصة بك وسرد methods الخاصة بها. أنشئ reflection لـ interface الخاصة بك، واحصل على methods الخاصة بها باستخدام getMethods() (التي تُرجع كائنات ReflectionMethod)، ثم اطبع getName() لكل method في سطر مستقل.

يجب أن يعرض الناتج اسمي method اللذين تُعلنهما interface الخاصة بك، كلٌّ منهما في سطر منفصل، بالترتيب الذي Defineتهما به.

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

جرّب بنفسك

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

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

// TODO: أنشئ كائن ReflectionClass لواجهة Messageable

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

// TODO: مر عبر الطرق واطبع اسم كل طريقة في سطر خاص بها

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

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم PHP عبر الإنترنت