البرمجة الكائنية في PHP: دليل عملي مع أمثلة

عرض مسبق
1 دقيقة
10 دقيقة قراءة

OOP in PHP – البرمجة الكائنية في PHP: دليل عملي مع أمثلة من الواقع

تعلّم مفهوم الكائنات، الوراثة، الكونستركتور، مستويات الوصول (public / protected / private)، والخصائص والوظائف الثابتة، وكيفية تطبيق هذه المفاهيم على أنظمة حقيقية مثل المستخدمين، العملاء، اللاعبين، وبيئات CRM.

لماذا تعتبر OOP مهمة في تطوير تطبيقات الأعمال؟

البرمجة الكائنية (OOP) تساعد على كتابة كود منظم، قابل لإعادة الاستخدام، وسهل الصيانة — وهو ما تحتاجه أي شركة تعمل على CRM، منصات تجارة إلكترونية، أنظمة تعليم، أو منتجات SaaS. بدلاً من الدوال المبعثرة، تقوم OOP بتنظيم الكود في كائنات تمثل عناصر حقيقية مثل (مستخدم – طلب – منتج). هذا يجعل التطوير أسرع وأكثر قابلية للتوسع.

أهداف الدرس

  • فهم مفهوم الكلاس (Class) والخصائص والدوال.
  • معرفة الفرق بين public و protected و private.
  • تعلم خصائص ودوال static وكيف تعمل.
  • فهم الكونستركتور وفرق $this و self::
  • شرح مثال Member و Player وربطه بتطبيقات أعمال حقيقية.
  • اتباع أفضل ممارسات كتابة كود OOP.

الكود المستخدم في المثال

في المثال يوجد ملفان: member.php و Player.php.

ملف member.php

<?php
class Member {
    public static $member = "Ali";
    public $memberName = "Ahmed";
    public static $memberSelected = "no";

    function __construct($age) {
        self::$memberSelected = "yes";
        echo $age;
    }

    public static function getMemberPublic() {
        echo "hello from function static <br/>";
    }

    protected function getMemberName() {
        echo "function getMemberName";
    }

    private function calcAgeInDays() {
        echo "<br/> calc age in days <br/>";
    }
}

ملف Player.php

<?php
include_once('member.php');

class Player extends Member {
    public function getPlayerName() {
        // $this->getMemberName(); // مسموح لأنها protected
        // $this->calcAgeInDays(); // خطأ لأنها private
    } 
}

echo Player::$memberSelected;
echo "<br/>";
new Player(32);
echo Player::$memberSelected;

شرح الكود خطوة بخطوة

1. خصائص الكائن (Instance Properties)

الخاصية $memberName تتغير لكل كائن جديد، لذلك تستخدم في البيانات الخاصة بمستخدم أو منتج أو طلب معين.

2. الخصائص الثابتة (Static)

مثل static $member تُشارك بين جميع الكائنات. تُستخدم للقيم العامة مثل الإعدادات أو عدادات عامة.

3. الكونستركتور __construct

يعمل عند إنشاء كائن جديد، ويستقبل العمر. في المثال يغيّر قيمة $memberSelected ويطبع العمر.

4. الفرق بين $this و self::

  • $this → يتعامل مع خصائص ودوال الكائن.
  • self:: → يتعامل مع خصائص ودوال الكلاس الثابتة.

5. مستويات الوصول

  • public: متاح للجميع.
  • protected: داخل الكلاس والوراثة فقط.
  • private: داخل نفس الكلاس فقط.

6. الدوال الثابتة

يمكن استدعاؤها بدون إنشاء كائن: Member::getMemberPublic()

7. سلوك static في المثال

القيمة تتغير بعد إنشاء كائن جديد لأن الكونستركتور عدّل الخاصية الثابتة.

أمثلة عملية من واقع الأعمال

مثال CRM

كلاس User أساسي، وكلاس Customer يرث منه ويضيف سجل المشتريات ونقاط الولاء.

مثال E-commerce

كلاس Product أساسي، و DigitalProduct يرث منه ويضيف رابط التحميل.

مثال Gaming / LMS

Member = بيانات عامة Player = بيانات اللاعب فقط

أفضل الممارسات

  1. استخدم التركيب (Composition) بدلاً من الوراثة الزائدة.
  2. لا تُكثر من الخصائص public.
  3. تجنب الاعتماد على static إلا عند الحاجة.
  4. اجعل الكونستركتور خفيفًا.
  5. استخدم protected عند الحاجة للوراثة.
  6. اكتب توثيق PHPDoc للوظائف.

أخطاء شائعة يجب تجنبها

  • استدعاء private من كلاس فرعي.
  • الإفراط في استخدام static.
  • طباعة النصوص داخل الموديل.
  • تكرار الخصائص في الوراثة.

نسخة محسّنة من الكود

<?php
class Member {
    protected string $memberName = "Ahmed";
    protected static string $memberSelected = "no";

    public function __construct(protected int $age) {
        self::$memberSelected = "yes";
    }

    public static function isMemberSelected(): bool {
        return self::$memberSelected === "yes";
    }

    protected function getMemberName(): string {
        return $this->memberName;
    }

    private function calcAgeInDays(): int {
        return $this->age * 365;
    }
}

class Player extends Member {
    public function getPlayerName(): string {
        return $this->getMemberName();
    }
}

$player = new Player(32);
echo $player->getPlayerName();
echo Member::isMemberSelected() ? 'selected' : 'not selected';

تمارين صغيرة

  1. أضف name و age إلى Member وأنشئ getProfile().
  2. أنشئ كلاس Coach يرث Member.
  3. استبدل static بميزة FeatureToggle.

أسئلة شائعة (SEO)

ما الفرق بين public و protected و private؟
public للجميع، protected داخل الكلاس والوراثة، private في نفس الكلاس فقط.
متى أستخدم static؟
عندما تكون القيمة مشتركة بين جميع الكائنات.
لماذا لا نطبع داخل الكونستركتور؟
لأن الكونستركتور مخصص لإعداد الكائن وليس للإخراج.

الخلاصة

هذه مقدمة قوية لفهم OOP في PHP وتطبيقها مباشرة في أنظمة الشركات والمنتجات. الدروس القادمة: الواجهات، الكلاسات المجردة، الـ Repository، الـ Service، الـ Factory، والاختبارات.

اقتراحات SEO

  • كلمات مفتاحية: OOP PHP، البرمجة الكائنية، PHP Classes، PHP Inheritance، تعلم PHP.
  • استخدم عناوين h2/h3 واضحة.
  • دعّم المقال بالأمثلة العملية.
تعلم أساسيات برمجة مواقع ديناميكية PHP & OOP & MySQLi & PDO

تعلم أساسيات برمجة مواقع ديناميكية PHP & OOP & MySQLi & PDO

php website
سوفت ويرPHPأساسيات تطوير مواقع الإنترنت
عرض الكورس

دروس الدورة