الكلمة المفتاحية Static في PHP

من موسوعة حسوب
< PHP
اذهب إلى: تصفح، ابحث

توضّح هذه الصفحة طريقة استخدام الكلمة المفتاحية static لتعريف التوابع والخاصيات الساكنة. يمكن استخدام static أيضًا لتعريف المتغيرات الساكنة والروابط الساكنة اللاحقة (late static bindings). يرجى الرجوع إلى تلك الصفحات للحصول على المزيد من المعلومات حول معنى static في كل حالة.

يؤدي التصريح الساكن عن الخاصيات والتوابع إلى القدرة على الوصول إليها دون الحاجة إلى تهيئة الصنف. لا يمكن الوصول إلى الخاصيات الساكنة في الكائنات المهيّئة من الأصناف (ولكن يمكن الوصول إلى التوابع الساكنة).

لضمان توافق الشيفرة مع الإصدار الرابع من PHP، تتعامل اللغة مع الخاصية أو التابع التي لم يُصرَّح عن قابلية رؤيتها على أنّها من النوع public.

التوابع الساكنة

لا يمكن استخدام المتغير الزائف ‎$this داخل التوابع الساكنة وذلك لأنّ هذه التوابع قابلة للاستدعاء دون الحاجة إلى إنشاء نسخة من الكائن.

تنبيه: في الإصدار الخامس من PHP يؤدي الاستدعاء السكوني لتابع غير ساكن إلى إطلاق تحذير من المستوى E_STRICT.

تحذير: في الإصدار السابع من اللغة، أصبح الاستدعاء السكوني لتابع غير ساكن مهملًا، ويؤدي إلى إطلاق تحذير من المستوى E_DEPRECATED. قد لا تدعم الإصدارات المستقبلية عملية الاستدعاء هذه.

المثال 1: مثال على تابع ساكن

<?php
class Foo {
    public static function aStaticMethod() {
        // ...
    }
}

Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod();
// منذ الإصدار 5.3.0
?>

الخاصيات الساكنة

لا يمكن الوصول إلى الخاصيات الساكنة باستخدام عامل السهم ‎->‎.

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

منذ الإصدار 5.3.0 من اللغة أصبح بالإمكان الإشارة إلى الصنف باستخدام متغير، بشرط أن لا يحمل المتغير قيمة تمثّل كلمةً مفتاحية (مثل self، و parent، و static).

المثال 2: مثال على خاصية ساكنة

<?php
class Foo
{
    public static $my_static = 'foo';

    public function staticValue() {
        return self::$my_static;
    }
}

class Bar extends Foo
{
    public function fooStatic() {
        return parent::$my_static;
    }
}


print Foo::$my_static . "\n";

$foo = new Foo();
print $foo->staticValue() . "\n";
print $foo->my_static . "\n";      // Undefined "Property" my_static 

print $foo::$my_static . "\n";
$classname = 'Foo';
// منذ الإصدار 5.3.0
print $classname::$my_static . "\n"; 

print Bar::$my_static . "\n";
$bar = new Bar();
print $bar->fooStatic() . "\n";
?>

مصادر