نعرف من خلال درايتنا بمجالات المتغيرات PHP Variable Scopes أن المتغيرات الساكنة PHP Static Variables لا يتم حذف قيمتها من ذاكرة البرنامج بل يحافظ عليها ساكنه لحين استخدامها مرة أخرى. كذلك الأمر بالنسبة للخصائص الساكنه الفئات.
السمات العامة للخصائص الساكنة يمكن الوصول مباشرةً للخصائص الساكنه دون الحاجة لإنشاء كائن جديد. إذا كانت جميع الخصائص ساكنه ستكون الفئة نفسها ساكنة. يتم اعتبار الخصائص الساكنه عامة public ما لم يتم تحديد مجال رؤية مخصص PHP Visibility.[highlight background=”” color=””]تذكر أنه لايمكن أن تكون قيمة متغير ساكن عبارة عن نتيجة لعملية معينة كما نعرف عن المتغيرات ساكنة المجالPHP Static Variables [/highlight]
الخصاص الساكنة Static Properties يمكن الوصول للخصائص الساكنة مباشرة عن طريق العلامة :: أو ما يسمى معامل تحديد المجال Scope Resolution Operator. يتم تعريف المتغير على أنه ساكن باستخدام الكلمة static . لا يمكن الوصول لقيمة متغير غير ساكن باستخدام العلامة::. <?php class test{ //متغير ساكن public static $a="Hello"; public $b="World"; public function a(){} } echo test::$a; echo test::$b; ?>كما نرى في السطر رقم 5 تم تعريف المتغير ( الخاصية ) على أنه ساكن باستخدام الكلمة static، ثم الوصول لقيمته دون الحاجة لإنشاء كائن جديد وذلك باستخدام المعامل :: في السطر رقم 13 . ولكن عند محاولة الوصول لمتغير غير ساكن بنفس الطريقة في السطر رقم 15 سيظهر خطأ فادح ( Fetal Error ) ينص على أن هناك محاولة للوصول لمتغير ( خاصية ) ساكن لم يتم تعريفه .
[highlight background=”” color=””]قد لا يظهر الخطأ وقد يتم تسجيله في ملف error_log حسب إعدادات معالجة الأخطاء PHP Error Handling[/highlight]
الوصول لمتغير ساكن من داخل الفئة نعرف أنه للوصول لخصائص الفئة من داخلها نستخدم الكلمة this، أما إذا كانت الخصائص ساكنه يجب استخدام الكلمة self على عكس $this تكتب self بدون علامة $ وإنما تكتب العلامة قبل اسم الخاصية هكذا self::$property يمكن استخدام اسم الفئة بدلاً من self هكذا ClassName::$property تحسباً لتغيير إسم كلاس يُنصح باستخدام self::$property بدلاً عن ClassName::$property . إذا كنت تريد الوصول للمتغير الساكن من خارج الفئة فلايمكن استخدام self وإنما يجب كتابة اسم الفئة متبوعاً بـ :: كما فعلنا في الأمثلة السابقة. <?php class test{ //متغير ساكن public static $a="Hello"; public function a(){ echo self::$a="Hello World"; } } $A = new test(); echo $A->a().'<br>'; ?>شرح الكود :
في السطر رقم 4 قمنا بتعريف خاصية ساكنة a$ وأعطيناهأ القيمة ” Hello “. في السطرر قم 7 قمنا بإضافة الطريقة ()a والتي ستقوم بتغيير قيمة الخاصية a$. في السطر رقم 9 قمنا بالوصول لقيمة الخاصية a$ عن طريق الكلمة self ثم غيرنا قيمتها إلى ” Hello World “. ثم في السطر رقم 14 أنشأنا كائن جديد A$ باستخدام الكلمة new. ثم قمنا باستدعاء الطريقة ()a فكانت النتيجة عرض الجملة ” Hello World “.وهذا يدل على أننا استطعنا الوصول للخاصية الساكنة من داخل الفئة باستخدام الكلمة self.
[button title=”عرض نتيجة / تحميل الكود” link=”https://makiomar.com/php-oop/php_statics/php_static_property/php_static_property.php” target=”_blank” size=”” color=”” class=””]
وكما قلنا أن الخصائص الساكنة تحافظ على قيمها ثابته في نهاية كل عملية فإن الكود التالي يثبت ذلك
<?php class test{ //متغير ساكن public static $a="Hello"; public function a(){ echo self::$a="Hello World"; } } echo test::$a.'<br>'; $A = new test(); echo $A->a().'<br>'; echo test::$a.'<br>'; //حذف الكائن unset( $A ); echo test::$a ?>شرح الكود :
في السطر رقم 4 قمنا بتعريف متغير ساكن a$ وأعطيناه القيمة ” Hello “ في السطرر قم 6 قمنا بإضافة الطريقة a() والتي ستقوم بتغيير قيمة الخاصية a$. في السطر رقم 7 قمنا بالوصول لقيمة الخاصية a$ عن طريق الكلمة self ثم غيرنا قيمتها إلى ” Hello World “. ثم في السطر رقم 12 قمنا بطباعة قيمة المتغير في الفئة باستخدام اسم الفئة. وستكون النتيجة هي ” Hello “. ثم في السطر رقم 14 قمنا بإنشاء كائن جديد A$. ثم في السطر رقم 16 قمنا باستدعاء الطريقة a() التي ستغير قيمة الخاصية a$ إلى ” Hello World “. ثم في السطر رقم 18 قمنا مرة أخرى بطباعة قيمة المتغير من الفئة وليس الكائن . وكانت النتيجة أيضاً ” Hello World “. وهذا يؤكد أن قيمة المتغير a$ أصبحت ساكنة ومحتفظة بقيمتها بعد آخر عملية تمت عليها. الآن في السطر رقم 21 قمنا بحذف الكائن باستخدام الدالة المدمجة في PHP وهي unset . ثم مرة أخري في السطر رقم 23 قمنا بطباعة قيمة المتغير من الفئة وكانت النتيجة أيضاً ” Hello World “. وهذا يؤكد أن قيمة المتغير a$ أصبحت ساكنة ومحتفظة بقيمتها حتى بعد حذف الكائن.[button title=”عرض نتيجة / تحميل الكود” link=”https://makiomar.com/php-oop/php_statics/php_static_property/php_static_var_value.php” target=”_blank” size=”” color=”” class=””]
استخدام الثوابت في الفئاتنعرف كيفية تعريف الثوابت PHP Constantsوطرق استخدامها وخصائصها، وعند استخدامها داخل الفئات لن يختلف الأمر كثيراً. فعند تعريف ثابت داخل الفئة تستخدم الكلمة const ، وإذا أردت الوصول لقيمة ثابت من داخل الفئة يمكن استخدام اسم الفئة أو الكلمة self
<?php class A{ // تعريف ثابت const A = "Hello"; public function hello(){ echo self::A.' '.'World'; } } $A= new A(); $A->hello(); ?>لم يختلف الأمر عن طريقة الوصول للقيم الساكنة من داخل الفئة. فقد استخدمنا الكلمة self للوصول إلى قيمة الثابت A من داخل الطريقة A() في السطر رقم 7. كذلك عن استدعاء الساكن من خارج الفئة نكتب اسم الفئة متبوعاً بـ :: ثم اسم الثابت.
[highlight background=”” color=””]لاتنسي أنه يتم كتابة الثوابت بدون علامة الدولار ( $ ) [/highlight]
[button title=”عرض نتيجة / تحميل الكود” link=”https://makiomar.com/php-oop/php_statics/php_static_property/php_const.php” target=”_blank” size=”” color=”” class=””]
الخصائص الساكنه مع التوريثإذا تم توريث PHP Inheritance فئة A إلى فئة B ، وأردت استخدام الخصائص/ الطرق الساكنة المعرفة في الفئة A داخل الفئة B فعليك استخدام الكلمة parent متبوعة بالعلامة :: ثم اسم الخاصية / الطريقة.
<?php class A{ //تعريف متغير ساكن public static $A = "Hello"; public static function hello(){ echo self::$A; } } //A توريث الفئة class B extends A{ public static function test(){ //parent استخدام المتغير الساكن الذي تم تعريفه في الفئة الموروثة return parent::$A.' '.'World'; } } echo B::test(); ?>شرح الكود :
في السطر رقم 4 قمنا بتعريف متغير ساكن قمنا بعمل توريث من الفئة A إلى فئة B في السطر رقم 12 قمنا في السطر رقم 14 بتعريف طريقة ساكنه ()test ثم في السطرر قم 16 قمنا باسترجاع PHP Returning Values قيمة المتغير الساكن الذي تم تعريفه في الفئة A باستخدام الكلمة parent ، ثم دمجه PHP String Concatenation مع السلسله النصية ” World “ في السطرر قم 20 قمنا مباشرة بطباعة نتيجة الطريقة السكنة test() عن طريق كتابة اسم الفئة B متبوعاً بالعلامة ::، فتكون النتيجه ” Hello World “[button title=”عرض نتيجة / تحميل الكود” link=”https://makiomar.com/php-oop/php_statics/php_static_property/php_static_inherit.php” target=”_blank” size=”” color=”” class=””]


