از زمان PHP 5.3.0 PHP یک ویژگی بنام انقیاد استاتیک دیررس پیاده نموده است تا برای ارجاع کلاسهای فراخوانی شده در متن ارثبری استاتیک فراهم باید
این ویژگی "انقیاد استاتیک دیررس" نام دارد که در ذهن یک دید داخلی دارد. "انقیاد دیررس" از این حقیقت ناشی میشود که static:: دیگر هنگام استفاده از کلاس و متد تعریف شده در آن تحلیل نخواهد گردید. و در زمان اجرا با توجه به اطلاعات این زمان محاسبه خواهد شد. همچنین به آن "انقیاد استاتیک" گفته میشود تا نشاندهنده استفاده آن برای فراخوانی متدهای استاتیک باشد (اما محدود به آن نیست).
ارجاع استاتیک به کلاس فعلی مانند self:: یا __CLASS__ با استفاده از کلاس تابع مورد نظر در محل تعریف تحلیل خواهد کرد:
Example #1 استفاده self::
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
self::who();
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
?>
The above example will output:
A
تلاشهای انقیاد استاتیک دیررس محدودیتهای ایجاد شده با معرفی کلمه کلیدی ارجاع به کلاس که در زمان اجرا فراخوانی میشود حل نموده است. اساسا یک کلمه کلیدی به شما امکان ارجاع به B از test() در مثال قبلی فراهم مینماید. تصمیم بر این است که که کلمه کلیدی جدید تعریف نگردد بلکه از کلمه کلیدی رزرو شده static استفاده شود.
Example #2 استفاده ساده static::
<?php
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // Here comes Late Static Bindings
}
}
class B extends A {
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 A {
public static function foo() {
static::who();
}
public static function who() {
echo __CLASS__."\n";
}
}
class B extends A {
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 A {
protected static function who() {
echo __CLASS__."\n";
}
public function __get($var) {
return static::who();
}
}
class B extends A {
protected static function who() {
echo __CLASS__."\n";
}
}
$b = new B;
$b->foo;
?>
The above example will output:
B