🚀 احتراف الخصائص الساكنة Static Properties في PHP

في الدروس السابقة، تعلمنا كيف نقوم بإنشاء الفئات (Classes) وكيف ننشئ منها كائنات (Objects) لكي نصل إلى الخصائص (Properties) الموجودة بداخلها.

لكن، هل فكرت يوماً: هل هناك طريقة للوصول إلى خاصية داخل الفئة دون الحاجة لإنشاء كائن (Object) باستخدام كلمة new؟ 🧐

هنا يأتي دور الخصائص الساكنة (Static Properties).


💡 ما هي الخصائص الساكنة (Static Properties)؟

في الوضع الطبيعي، عندما نعرّف خاصية داخل الفئة، فإن كل "كائن" ننشئه يحصل على نسخة خاصة به من هذه الخاصية. أما الخاصية الساكنة فهي خاصية "مشتركة" بين جميع الكائنات التي يتم إنشاؤها من تلك الفئة.

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

متى نستخدمها؟ نستخدمها عندما نريد تخزين معلومة تكون ثابتة أو مشتركة لجميع الكائنات، مثل "عداد" يحسب عدد السيارات التي تم تصنيعها، أو "اسم الشركة" التي تنتج هذه السيارات.


🛠️ كيف نعرّف الخاصية الساكنة؟

لكي نخبر PHP أن هذه الخاصية "ساكنة"، نستخدم الكلمة المحجوزة static قبل تعريف المتغير داخل الفئة.

القاعدة الأساسية: static $variable_name;

لنلقِ نظرة على هذا المثال البسيط جداً:

<?php
class Game {
    // تعريف خاصية ساكنة لتمثيل اسم اللعبة
    public static $gameName = "Super Adventure";
}
?>

في المثال أعلاه، قمنا بتعريف $gameName كخاصية ساكنة. لاحظ أننا لم نستخدم new Game() للوصول إليها، بل سنفعل ذلك في الخطوة التالية.


🎯 كيف نصل إلى الخصائص الساكنة؟

بما أن الخاصية الساكنة تنتمي للفئة وليس للكائن، فنحن لا نستخدم السهم (->) للوصول إليها. بدلاً من ذلك، نستخدم ما يسمى بـ عامل دقة النطاق (Scope Resolution Operator) وهو عبارة عن شرطتين مائلتين مزدوجتين ::.

الطريقة تكون كالتالي: ClassName::$propertyName;

لنطبق هذا برمجياً:

<?php
class Game {
    public static $gameName = "Super Adventure";
}

// الوصول إلى الخاصية الساكنة مباشرة من اسم الفئة
echo "Welcome to " . Game::$gameName; 
// المخرجات: Welcome to Super Adventure
?>

لاحظ هنا أننا لم نكتب $myGame = new Game(); بل ذهبنا مباشرة إلى Game::$gameName. هذا يوفر في استهلاك الذاكرة ويجعل الكود أسرع عندما لا نحتاج لإنشاء كائنات.


🔄 تحديث القيم في الخصائص الساكنة

الجميل في الخصائص الساكنة أنها "تتذكر" القيمة عبر جميع الكائنات. إذا قمت بتغيير قيمة الخاصية الساكنة، فإن التغيير سيظهر في كل مكان.

شاهد هذا المثال العملي (عداد الزوار):

<?php
class VisitorCounter {
    // خاصية ساكنة لعد الزوار، تبدأ من صفر
    public static $count = 0;

    public function increment() {
        // الوصول إلى الخاصية الساكنة من داخل الفئة باستخدام self
        self::$count++;
    }
}

// إنشاء كائنين مختلفين
$visitor1 = new VisitorCounter();
$visitor2 = new VisitorCounter();

// زيادة العداد عن طريق الكائن الأول
$visitor1->increment(); // العداد يصبح 1
$visitor1->increment(); // العداد يصبح 2

// زيادة العداد عن طريق الكائن الثاني
$visitor2->increment(); // العداد يصبح 3

// طباعة القيمة النهائية من اسم الفئة مباشرة
echo "Total Visitors: " . VisitorCounter::$count; 
// المخرجات: Total Visitors: 3
?>

شرح الكود:

  1. استخدمنا self::$count بدلاً من Game::$count لأننا كنا داخل الفئة نفسها. كلمة self تعني "هذه الفئة".
  2. لاحظ أن الكائن الأول زاد العداد مرتين، ثم جاء الكائن الثاني وأكمل الزيادة من حيث توقف الأول، لأن $count مشتركة بينهما.

⚠️ ملاحظات هامة جداً

  1. لا تستخدم $this: لا يمكنك أبداً استخدام $this-> للوصول إلى خاصية ساكنة. تذكر دائماً: $this للكائنات، و self:: أو ClassName:: للخصائص الساكنة.
  2. الذاكرة: الخصائص الساكنة توفر الذاكرة لأنها لا تتكرر مع كل كائن جديد.

🎓 ملخص الدرس

  • Static Properties: هي خصائص تنتمي للفئة وليس للكائن.
  • التعريف: نستخدم الكلمة static قبل المتغير.
  • الوصول الخارجي: نستخدم ClassName::$variable.
  • الوصول الداخلي: نستخدم self::$variable.
  • الفائدة: مشاركة قيمة واحدة بين جميع الكائنات المنشأة من الفئة.