کلاس‌‌ها و اشیا (PHP 5)
PHP Manual

انقیاد استاتیک دیررس

از زمان PHP 5.3.0 PHP یک ویژگی بنام انقیاد استاتیک دیررس پیاده نموده است تا برای ارجاع کلاس‌های فراخوانی شده در متن ارث‌بری استاتیک فراهم باید

این ویژگی "انقیاد استاتیک دیررس" نام دارد که در ذهن یک دید داخلی دارد. "انقیاد دیررس" از این حقیقت ناشی می‌شود که static:: دیگر هنگام استفاده از کلاس و متد تعریف شده در آن تحلیل نخواهد گردید. و در زمان اجرا با توجه به اطلاعات این زمان محاسبه خواهد شد. همچنین به آن "انقیاد استاتیک" گفته می‌شود تا نشان‌دهنده استفاده آن برای فراخوانی متد‌های استاتیک باشد (اما محدود به آن نیست).

محدودیت‌های self::

ارجاع استاتیک به کلاس فعلی مانند self:: یا __CLASS__ با استفاده از کلاس تابع مورد نظر در محل تعریف تحلیل خواهد کرد:

Example #1 استفاده self::

<?php
class {
    public static function 
who() {
        echo 
__CLASS__;
    }
    public static function 
test() {
        
self::who();      
    }  
}  

class 
extends {      
    public static function 
who() {
         echo 
__CLASS__;
    }  
}   

B::test();
?>

The above example will output:

A

استفاده از انقیاد دیررس استاتیک

تلاش‌های انقیاد استاتیک دیررس محدودیت‌های ایجاد شده با معرفی کلمه کلیدی ارجاع به کلاس که در زمان اجرا فراخوانی می‌شود حل نموده است. اساسا یک کلمه کلیدی به شما امکان ارجاع به B از test() در مثال قبلی فراهم می‌نماید. تصمیم بر این است که که کلمه کلیدی جدید تعریف نگردد بلکه از کلمه کلیدی رزرو شده static استفاده شود.

Example #2 استفاده ساده static::

<?php
class {
    public static function 
who() {
        echo 
__CLASS__;
    }
    public static function 
test() {
        static::
who(); // Here comes Late Static Bindings     
    
}  
}  

class 
extends {      
    public static function 
who() {
         echo 
__CLASS__;
    }  
}   

B::test();
?>

The above example will output:

B

Note:

static:: همانند $this برای متدهای استاتیک عمل نمی‌کند! $this-> قوانین استثنا را دنبال می‌نماید در حالی که static:: این کار را انجام نمی‌دهد. تفاوت کامل آنها در این راهنما وجود دارد.

Example #3 استفاده static:: در متن غیر استاتیک

<?php
class TestChild extends TestParent {
    public function 
__construct() {
        static::
who();
    }

    public function 
test() {
        
$o = new TestParent();
    }

    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}

class 
TestParent {
    public function 
__construct() {
        static::
who();
    }

    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}
$o = new TestChild;
$o->test();

?>

The above example will output:

TestChild
TestParent

Note:

انقیاد دیررس استاتیک در حالت فراخوانی استاتیک کامل بدون بازگشت متوقف خواهد شد.

Example #4 فراخوانی استاتیک کاملا تحلیل شده

<?php
class {
    public static function 
foo() {
        static::
who();
    }
        
    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}

class 
extends {
    public static function 
test() {
        
A::foo();
    }

    public static function 
who() {
        echo 
__CLASS__."\n";
    }
}

B::test();
?>

The above example will output:

A

حالت‌های لبه

راه‌های مختلفی برای فراخوانی یک متد در PHP مانند بازگشت عقبی یا متدهای جادویی وجود دارد. انقیاد استاتیک براساس اطلاعات زمان اجرا ساخته می‌شود ممکن است نتایج غیرمنتظره‌ای در حالت‌های لبه داشته باشد.

Example #5 انقیاد دیررس استاتیک در زمان اجرا

<?php
class {

   protected static function 
who() {
        echo 
__CLASS__."\n";
   }

   public function 
__get($var) {
       return static::
who();
   }
}

class 
extends {

   protected static function 
who() {
        echo 
__CLASS__."\n";
   }
}

$b = new B;
$b->foo;
?>

The above example will output:

B

کلاس‌‌ها و اشیا (PHP 5)
PHP Manual