خصائص الـ Instance مقابل الخصائص الساكنة (Static)
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 15 من 91.
عندما تقوم بإنشاء خاصية (property) في فئة (class)، يجب عليك تحديد ما إذا كانت تنتمي إلى كل كائن (object) بشكل فردي أو إلى الفئة نفسها. هذا التمييز هو الفرق بين خصائص المثيل (instance properties) والخصائص الثابتة (static properties).
تُعد خصائص النسخة (Instance properties) هي الافتراضية. يحصل كل كائن على نسخته الخاصة من الخاصية، وتغييرها في كائن واحد لا يؤثر على الكائنات الأخرى:
<?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
تنتمي الخصائص الثابتة (Static properties) إلى الفئة (class)، وليس إلى أي كائن محدد. يمكنك التصريح عنها باستخدام الكلمة المفتاحية static والوصول إليها باستخدام اسم الفئة مع :: بدلاً من استخدام كائن مع ->:
<?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 عبر جميع النسخ (instances). في كل مرة ننشئ فيها User جديد، يزداد نفس المتغير $count. داخل الـ class، نستخدم self::$count للإشارة إلى الخاصية الثابتة (static property).
نقطة رئيسية: استخدم خصائص النسخة (instance properties) عندما يحتاج كل كائن إلى قيمته الخاصة. استخدم الخصائص الثابتة (static properties) عندما تحتاج إلى مشاركة البيانات عبر جميع كائنات الفئة (class)، مثل عد النسخ أو تخزين الإعدادات.
التحدي
سهللنقم ببناء نظام لتتبع الزوار يوضح الفرق بين خصائص المثيل (instance properties) (الفريدة لكل زائر) والخصائص الثابتة (static properties) (المشتركة بين جميع الزوار).
ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:
Visitor.php— قم بتعريف فئةVisitorالتي تتتبع الزوار الفرديين وتحتفظ بعدد إجمالي للزوار. يجب أن يكون لكل زائر خاصية$nameالخاصة به (instance property)، بينما يجب مشاركة خاصية$totalVisitorsعبر جميع المثيلات (static property). يقبل المنشئ (constructor) اسماً، ويقوم بتعيينه، ويزيد إجمالي عدد الزوار. أضف تابعgetInfo()الذي يعيد"[name] is visitor #[totalVisitors]".main.php— قم بتضمين ملف فئة Visitor، ثم أنشئ ثلاثة زوار بالأسماء"Alice"و"Bob"و"Charlie"(بهذا الترتيب). بعد إنشاء الثلاثة جميعاً، اطبع نتيجة استدعاءgetInfo()لكل زائر (كل واحد في سطر مستقل)، ثم اطبع إجمالي عدد الزوار من خلال الوصول إلى الخاصية الثابتة مباشرة من الفئة باستخدامVisitor::$totalVisitors.
تذكر أنه داخل الفئة، يمكنك الوصول إلى الخصائص الثابتة باستخدام self::$propertyName، بينما من خارج الفئة تستخدم ClassName::$propertyName. يتم الوصول إلى خصائص المثيل باستخدام $this->propertyName كالمعتاد.
يجب أن يظهر مخرجك كل زائر مع الرقم المخصص له، يليه العدد الإجمالي النهائي في السطر الأخير.
ورقة مرجعية
تنتمي خصائص الكائن (Instance properties) إلى كل كائن بمفرده، بينما تنتمي الخصائص الثابتة (static properties) إلى الفئة (class) نفسها وتتم مشاركتها عبر جميع الكائنات.
خصائص الكائن (Instance Properties):
يحصل كل كائن على نسخته الخاصة من الخاصية:
<?php
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$alice = new User("Alice");
$bob = new User("Bob");
echo $alice->name; // Alice
echo $bob->name; // Bob
الخصائص الثابتة (Static Properties):
يتم التصريح عنها باستخدام الكلمة المفتاحية static وتتم مشاركتها عبر جميع الكائنات:
<?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
الوصول إلى الخصائص الثابتة:
- داخل الفئة:
self::$propertyName - خارج الفئة:
ClassName::$propertyName
الوصول إلى خصائص الكائن:
- داخل الفئة:
$this->propertyName - خارج الفئة:
$object->propertyName
جرّب بنفسك
<?php
// تضمين فئة Visitor
require_once 'Visitor.php';
// TODO: قم بإنشاء ثلاثة زوار بأسماء "Alice" و "Bob" و "Charlie" (بهذا الترتيب)
// TODO: اطبع نتيجة getInfo() لكل زائر (كل واحدة في سطر منفصل)
// TODO: اطبع إجمالي عدد الزوار باستخدام Visitor::$totalVisitors
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsالكلمة المفتاحية $thisالـ Methodsالـ Propertiesالمنشئ (__construct)الهادم (__destruct)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةالكلمة المفتاحية parent::إعادة تعريف الدوال (Method Overriding)الكلمة المفتاحية finalالأصناف المجردة (Abstract Classes)مراجعة - هيكلية الموظفين7التغليف (Encapsulation)
العام، المحمي، الخاص (Public, Protected, Private)نظرة متعمقة على معدلات الوصولدوال Getters و Settersإخفاء المعلوماتميزة Constructor Promotion (8.0)مراجعة - نظام سجلات الطلاب10مفاهيم البرمجة كائنية التوجه المتقدمة
التركيب مقابل الوراثةحقن التبعيةالأصناف المجهولةالتعدادات (PHP 8.1)الألياف (PHP 8.1)تعمق في استنساخ الكائناتالمولدات والمكررات13أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع2مساحات الأسماء والتحميل التلقائي
مقدمة إلى مساحات الأسماءالكلمة المفتاحية useمعيار التحميل التلقائي PSR-4أداة التحميل التلقائي Composerملخص - مشروع منظم5الواجهات والعقود
مقدمة إلى الواجهاتتنفيذ الواجهاتتنفيذ واجهات متعددةالواجهة مقابل الـ Abstract Classالـ Type Hinting مع الواجهاتملخص - حاسبة الأشكال8الميثودات السحرية (Magic Methods)
مقدمة في الميثودات السحرية__toString و __debugInfo__get, __set, __isset, __unset__call و __callStatic__clone واستنساخ الكائنات__serialize و __unserializeمراجعة - Custom Collection3خصائص الكلاس
خصائص الـ Instance مقابل الخصائص الساكنة (Static)الثوابت في الكلاساتالدوال والخصائص الساكنة (Static)الخصائص الخاصة (Private) والمحمية (Protected)خصائص للقراءة فقط (Readonly) في PHP 8.1مراجعة - مدير الحساب البنكي6تعدد الأشكال (Polymorphism)
مراجعة إعادة تعريف الدوال (Method Overriding)تعدد الأشكال عبر الـ Interfacesتلميح النوع (Type Hinting) وأنواع الاتحاد (Union Types)الربط الاستاتيكي المتأخر (Late Static Binding)ملخص - معالج الدفع (Payment Processor)