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

خصائص الـ Instance مقابل الخصائص الساكنة (Static)

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

عندما تنشئ خاصية في class، عليك أن تقرر ما إذا كانت تنتمي إلى كل كائن فردي أم إلى class نفسها. هذا التمييز هو الفرق بين الخصائص الخاصة بـ instance والخصائص static.

تكون properties الخاصة بـ Instance هي الإعداد الافتراضي. يحصل كل كائن على نسخته own من property، وتغييرها في كائن واحد لا يؤثر في الكائنات الأخرى:

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name . "\n";
echo $bob->name . "\n";

المخرجات:

Alice
Bob

تنتمي properties الثابتة إلى class، وليس إلى أي كائن محدد. تُعلن عنها باستخدام الكلمة المفتاحية static وتصل إليها باستخدام اسم class مع :: بدلًا من كائن مع ->:

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count;

المخرجات:

2

لاحظ كيف تتم مشاركة $count بين جميع النُسخ. في كل مرة ننشئ فيها User جديدًا، تزداد قيمة المتغير $count نفسه. داخل الفئة، نستخدم self::$count للإشارة إلى الخاصية الساكنة.

النقطة الأساسية: استخدم instance properties عندما يحتاج كل كائن إلى قيمته own. استخدم static properties عندما تحتاج إلى مشاركة البيانات عبر all الكائنات من class، مثل عدّ الكائنات أو تخزين الإعدادات.

challenge icon

التحدي

سهل

لنبنِ نظامًا لتتبّع الزوار يوضّح الفرق بين خصائص instance (الفريدة لكل زائر) وخصائص static (المشتركة بين جميع الزوار).

ستنشئ ملفين لتنظيم التعليمات البرمجية:

  • Visitor.php: Define فئة Visitor تتتبّع الزوار الفرديين وتحافظ على عدّاد متزايد لإجمالي الزوار. يجب أن يمتلك كل زائر خاصية $name خاصة به (خاصية instance)، بينما يجب مشاركة خاصية $totalVisitors بين جميع instances (خاصية static). يقبل constructor اسمًا، ويعيّنه، ثم يزيد إجمالي عدد الزوار. أضف method باسم getInfo() التي returns "[name] is visitor #[totalVisitors]".
  • main.php: Include ملف فئة Visitor، ثم أنشئ ثلاثة زوار بالأسماء "Alice" و"Bob" و"Charlie" (بهذا order). بعد إنشاء الزوار الثلاثة، اطبع result استدعاء getInfo() لكل زائر (كل واحد في line خاصة به)، ثم اطبع إجمالي عدد الزوار من خلال الوصول مباشرةً إلى الخاصية static من الفئة باستخدام Visitor::$totalVisitors.

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

يجب أن يُظهر الإخراج كل زائر مع الرقم المعيّن له، يليه الإجمالي النهائي في السطر الأخير.

جرّب بنفسك

<?php
// تضمين فئة Visitor
require_once 'Visitor.php';

// TODO: أنشئ ثلاثة زوار بأسماء "Alice" و "Bob" و "Charlie" (بهذا الترتيب)

// TODO: اطبع نتيجة getInfo() لكل زائر (كل واحد في سطره الخاص)

// TODO: اطبع إجمالي عدد الزوار باستخدام Visitor::$totalVisitors
?>
quiz iconاختبر نفسك

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

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

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