خصائص الـ 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، مثل عدّ الكائنات أو تخزين الإعدادات.
التحدي
سهللنبنِ نظامًا لتتبّع الزوار يوضّح الفرق بين خصائص 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
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
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)تدرّب بنفسك: مترجم PHP عبر الإنترنت