3.2 · البرمجة كائنية التوجه (OOP) (الأصناف، الوراثة (inheritance)، الواجهات (interfaces))

المستوى 3 · قواعد البيانات والبرمجة كائنية التوجه (Databases & OOP)

3.2البرمجة كائنية التوجه (OOP) (الأصناف، الوراثة (inheritance)، الواجهات (interfaces))

الهدف: التفكير والبرمجة بالكائنات (الأصناف، الخصائص، الطرق، $this) وإتقان البرمجة كائنية التوجه (OOP) (التغليف (encapsulation)، الوراثة (inheritance)، تعدد الأشكال، الواجهات (interfaces)، السمات (traits)) — نموذج PHP الحديث والأطر.
الوقت المقدّر: 13 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • الصنف نموذج، والكائن نسخة : خصائص (بيانات) + طرق (سلوكيات)، وnew للإنشاء، و$this للكائن الحالي، و__construct للتهيئة.
  • التغليف (encapsulation) يحمي الحالة : خصائص private + getters/setters تتحقق — الكائن يضمن اتساقه الخاص.
  • الوراثة والواجهات والسمات تُهيكِل : extends للتخصيص، وinterface للتعاقد، وtrait للمشاركة دون وراثة.

حالة مصغرة متسلسلة — رياد يرتب كود السباغيتي في كائنات

رياد، مطور وب في قسنطينة، يدير المستعملين والطلبات بجداول ودوال مبعثرة : بريد غير صالح مُدسوس في أي مكان يكسر الإرسال. نمذج صنف مستعمل (خصائص private، و setters تتحقق، وبانٍ يهيئ)، وصنف مدير يرث (extends) المستعمل، وواجهة (interface) قابلة للإشعار (Notifiable) ينفذها الاثنان. البيانات غير الصالحة تُرفَض من المصدر، والكود يُقرَأ كما المهنة.

هذه الحالة نفسها تعود في الدرس والمخطط والنص الجاهز وتحدي 48 ساعة.

1. الأصناف والكائنات والتغليف (encapsulation)

تنظم البرمجة كائنية التوجه (OOP) الكود حول كائنات تجمع البيانات والسلوكيات. الصنف هو النموذج : خصائص (للمستعمل اسم وبريد) وطرق (يمكنه تسجيل الدخول). ننشئ كائنات بـ $user = new User()، والباني __construct() يهيئ عند الإنشاء، و$this يعين الكائن الحالي ($this->nom).

يضبط التغليف (encapsulation) الوصول عبر الظهور : public (في كل مكان)، وprivate (الصنف وحده)، وprotected (الصنف + الخلف). نجعل الخصائص private ونصل إليها عبر getters/setters تتحقق : يستحيل وضع بريد غير صالح مباشرة. يحمي الكائن حالته — مبدأ قوة مفتاحي يطبقه رياد على كل كيان.

2. الوراثة (inheritance) وتعدد الأشكال والواجهات والسمات

تجعل الوراثة (inheritance) (class Admin extends User) نعيد الاستعمال ونخصص : يحصل Admin على كل ما لـ User، ويضيف أو يعيد تعريف طرق. وتعدد الأشكال يتيح لأصناف مختلفة الرد على الطريقة نفسها كل بأسلوبه — مثالي لكود عام. والتجريد يخفي التعقيد خلف واجهات بسيطة.

الواجهات (interfaces) عقود : تعلن طرقا يجب على الصنف تنفيذها، دون أن تقول كيف — نبرمج « بالعقد »، ونفك الارتباط (لا غنى عنه للاختبار). والسمات (traits) تشارك طرقا بين أصناف دون وراثة (PHP لا تتيح سوى extends واحد). يحتفظ رياد بالترتيب : العقد أولا (interface)، ثم المشاركة (trait)، وأخيرا التخصيص (extends).

خطأ شائع في الفهم: « البرمجة كائنية التوجه مجرد أصناف فيها دوال، و private لا نفع فيه ». لا. دون تغليف (الكل public)، تفسد الحالة من كل مكان دون ضبط ؛ ودون واجهات، يرتبط الكود بالتنفيذات الملموسة ويصبح غير قابل للاختبار. البرمجة كائنية التوجه انضباط حماية وعقود، لا مجرد ترتيب.
الأركان الأربعة + أداتان من الكائن المحمي إلى الكود المفكوك الصنف ← الكائنخصائص + طرق، new، $this+التغليف (encapsulation)private + getters/setters تتحقق+الوراثة + تعدد الأشكالextends، إعادة تعريف، الطريقة نفسها الواجهات = عقود تُنفَّذ ؛ والسمات = طرق مشتركة دون وراثة.
من الكائن المحمي إلى الكود المفكوك
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) الصنف والكائن : يكتب رياد نموذج المستعمل ثم ينشئ كل زبون بـ new. 2) التغليف : لا تتغير الخصائص private إلا عبر setters تتحقق من البريد. 3) الوراثة وتعدد الأشكال : يرث Admin المستعمل (extends) ويعيد تعريف حقوقه ؛ ويرد كل دور على peutAcceder() بأسلوبه. 4) العقود والمشاركة : واجهة Notifiable وسمة تسجيل تفكان ارتباط الكود. الدرس : احمِ، وخصص، وتعاقد.

$this الذي يظن نفسه الآخرين

« كان صنف المدير عندي يعدل رصيد الزبناء : جعلت كل شيء public. »
التغليف قُرئ صباح الغد، مع قهوة مركزة

Private أولا : الكائن يحتفظ بشؤونه لنفسه.

🔎 مثال ملموس — صنف مغلف ووراثة

ينمذج رياد مستعملا يتحقق من بريده، ثم مديرا.

nom = $nom;
    $this->setEmail($email);
  }
  public function setEmail(string $email): void {
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      throw new InvalidArgumentException('Email invalide.');
    }
    $this->email = $email;
  }
  public function getEmail(): string { return $this->email; }
}
class Admin extends Utilisateur {
  public function peutAcceder(string $ressource): bool { return true; }
}

القراءة : بانٍ يهيئ، و setter مدعوم بـ private يتحقق، ووراثة تخصص.

الدرس : البريد غير الصالح يُرفَض من المصدر — الكائن يضمن اتساقه.

مفردات القسم

البرمجة كائنية التوجه (OOP) / الصنف / الكائن
نموذج ينظم الكود في كائنات (بيانات + سلوكيات) ؛ الصنف هو النموذج، والكائن نسخة (new) ؛ و $this = الحالي، و __construct = التهيئة.

مثال بسيط: new Utilisateur('Riad', 'riad@exemple-fictif.test').

ما ليس كذلك: دوال ومتغيرات مبعثرة دون نموذج.

رد فعل: نمذجة كل كيان مهني في صنف.

التغليف (encapsulation) / الظهور
تجميع وضبط الوصول : public (في كل مكان)، و private (الصنف وحده)، و protected (الصنف + الخلف) ؛ private + getters/setters لحماية الحالة.

مثال بسيط: setEmail لرياد الذي يرفض غير الصالح.

ما ليس كذلك: خصائص public قابلة للتعديل كيفما كان.

رد فعل: خصائص private افتراضيا.

الوراثة (inheritance)
class Admin extends User : تعيد استعمال أعضاء الأب، وتضيف أو تعيد تعريف ؛ علاقة « نوع من ».

مثال بسيط: يرث Admin المستعمل ويعيد تعريف peutAcceder().

ما ليس كذلك: نسخ-لصق طرق بين الأصناف.

رد فعل: الوراثة للتخصيص، لا للنسخ.

تعدد الأشكال / التجريد
الطريقة نفسها، وسلوكيات مختلفة حسب الصنف ؛ وإخفاء التعقيد خلف واجهات بسيطة.

مثال بسيط: يرد كل دور على peutAcceder() بأسلوبه.

ما ليس كذلك: switch ضخم على نوع الكائن.

رد فعل: نادِ الطريقة، ودع الكائن يقرر.

الواجهات (interfaces) / السمات (traits)
الواجهة : عقد طرق يجب تنفيذها (لفك الارتباط والاختبار). السمة : مشاركة أفقية لطرق دون وراثة.

مثال بسيط: Notifiable ينفذها المستعمل والطلب.

ما ليس كذلك: الاعتماد في كل مكان على صنف ملموس.

رد فعل: الاعتماد على واجهات، والمشاركة بسمات.

في التطبيق — التفكير والبرمجة بالكائنات

  1. أنشئوا صنفا (مثلا User) بخصائص (الاسم، البريد) وطرق ؛ وأنشئوا نسخا بـ `new`، وهيئوا عبر __construct، واستعملوا $this.
  2. طبقوا التغليف : خصائص private، والوصول عبر getters/setters تتحقق ؛ ونمطوا الخصائص.
  3. أنشئوا صنفا يرث (extends) ويعيد تعريف طريقة ؛ ولاحظوا إعادة الاستعمال والتخصيص.
  4. عرفوا واجهة (interface) (عقد) وصنفا ينفذها ؛ واستكشفوا سمة لمشاركة طرق.
تفكرون وتبرمجون بالكائنات (الأصناف، الخصائص، الطرق، $this) وتتقنون البرمجة كائنية التوجه (التغليف، الوراثة، تعدد الأشكال، الواجهات، السمات) — نموذج PHP الحديث والأطر.

نص جاهز للقول — عرض النمذجة الكائنية (30 ثانية)

« المستعملون منمذجون في صنف : خصائص private، وبانٍ يهيئ، و setters تتحقق من البريد. يرث المدير المستعمل ويعيد تعريف حقوقه، وينفذ الاثنان واجهة Notifiable. البيانة غير الصالحة تُرفَض من المصدر. »

يُقال في المراجعة ؛ ويُعرَض الـ setter الذي يرمي الاستثناء.

نموذج نسخ-لصق — صنف مغلف + واجهة

nom = $nom;
    $this->setEmail($email);
  }
  public function setEmail(string $email): void {
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
      throw new InvalidArgumentException('Email invalide.');
    }
    $this->email = $email;
  }
  public function getEmail(): string { return $this->email; }
}
class Admin extends Utilisateur {
  public function peutAcceder(string $ressource): bool { return true; }
}

مستقل

يكفي صنف زبون مغلف لتأمين عروض الأسعار المولدة.

مقاولة صغيرة في قسنطينة

ينمذج رياد الزبناء والطلبات والمدراء المترابطين، وكل يتحقق من حالته.

فريق منتج

فرض الواجهات والتغليف لوحدات قابلة للاختبار بين الفرق.

مبتدئ

هذا الأسبوع : صنف واحد بخاصيتين private و setter يتحقق.

✓ ممارسات جيدة

  • خصائص private افتراضيا، والوصول عبر طرق تتحقق.
  • تنميط الخصائص والتواقيع (متانة + مقروئية).
  • البرمجة بالعقد (الواجهات) لفك الارتباط والاختبار.

✗ أخطاء شائعة

  • وضع كل شيء public (حالة قابلة للفساد من كل مكان).
  • الوراثة لنسخ الكود بدل تخصيص « نوع من ».
  • الخلط بين الواجهة (عقد) والوراثة (إعادة استعمال).

النقاط الأساسية

  • تنظم البرمجة كائنية التوجه الكود في كائنات (بيانات + سلوكيات). الصنف = نموذج ؛ والكائن = نسخة (new). $this = الحالي ؛ و __construct = التهيئة.
  • التغليف : الظهور (public/private/protected) ؛ private + getters/setters تتحقق لحماية الحالة. الوراثة (extends) : إعادة الاستعمال والتخصيص.
  • تعدد الأشكال (الطريقة نفسها، تنفيذات مختلفة) والتجريد. الواجهات = عقود (فك الارتباط، الاختبار) ؛ والسمات = مشاركة دون وراثة.
  • البرمجة كائنية التوجه هي منعطف PHP الحديث والأطر : التنظيم، وإعادة الاستعمال، والصيانة — تغير تفكير يتطلب ممارسة.

تحدي 48 ساعة — طبّق غدا

اكتبوا صنفا مغلفا واحدا (private + setter يتحقق) وصنفا بنتا واحدا يعيد تعريف طريقة واحدة.

قائمة الخروج من القسم
  • أميز الصنف (نموذج) عن الكائن (نسخة).
  • خصائصي private مع تحقق.
  • أرث للتخصيص وأتعاقد بالواجهة.
تقييم ذاتي 1-5 : هل يمكن أن توجد حالة غير صالحة في كائناتي ؟هل تستهدف اعتماداتي واجهات ؟

أسئلة شائعة

لماذا نمر إلى البرمجة كائنية التوجه والإجرائي يشتغل ؟

يبعثر الإجرائي البيانات والدوال دون بنية : في تطبيق يكبر، لا نعرف أي دوال لأي بيانات. تجمع البرمجة كائنية التوجه (تُجمِّع) (الكائن = بيانات + سلوكيات)، وتُنمذِج المهنة (مستعمل، طلب)، وتحمي الحالة (التغليف) وتعيد الاستعمال (الوراثة، السمات) مع فك الارتباط (الواجهات). إنها نموذج أطر المستوى 4 — المنعطف الواجب تجاوزه.

التغليف والوراثة والواجهات : كيف نفهمها عمليا ؟

التغليف = الحماية والتجميع : لا يتغير رصيد حساب إلا عبر إيداع/سحب يتحققان (أبدا إسناد مباشر). الوراثة = « نوع من » : كلب يرث (extends) حيوانا فيعيد الاستعمال ويخصص (النباح). الواجهة = عقد : يلتزم الصنف بتوفير طرق، ويعتمد باقي الكود على العقد (قابل للاختبار). السمة = مشاركة أفقية حين لا يكفي extends واحد.

تحقّق من فهمك

لماذا خصائص private + getters/setters ؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 3أسئلة جديدة وأصعب للتحقق من مكتسباتك