1. 程式人生 > 實用技巧 >御麗詩妃,靜態成員在PHP中是怎麼繼承的?

御麗詩妃,靜態成員在PHP中是怎麼繼承的?

御麗詩妃,本內容來源於網路,著作權歸屬原作者。靜態成員在PHP中是怎麼繼承的?

原創 硬核專案經理 2020-08-17 17:19:11

靜態成員,也就是用static修飾的變數或者方法,如果搞不清楚它們實現的原理,就很容易會出現一些錯誤。這次我們來研究的是在繼承中靜態成員的呼叫情況。首先來看這樣一段程式碼:

classA{
static$a='ThisisA!';

publicfunctionshow()
{
echoself::$a,PHP_EOL;
echostatic::$a,PHP_EOL;
}
}

classBextendsA{
static$a='ThisisB!';

}

$b=newB;
$b->show();

之前的文章中,我們有說過self的問題。self僅僅只是指向當前這個類。注意,是類,不是例項化後的物件。所以上面的輸出結果是:

ThisisA!
ThisisB!

好了,有了這個基礎之後,我們知道靜態成員是和類有關的,和物件無關。那麼以下的程式碼也就更容易理解了。

classC{
static$c=1;
public$d=1;
}
classDextendsC{
publicfunctionadd()
{
self::$c++;
$this->d++;
}
}

$d1=newD();
$d2=newD();

$d1->add();
echo'c:'.D::$c.',d:'.$d1->d.';',PHP_EOL;

$d2->add();
echo'c:'.D::$c.',d:'.$d2->d.';',PHP_EOL;

直接讀程式碼能推匯出輸出的結果嗎?其實只要掌握了上文中所說的原則,這段程式碼就很容易理解了。\$c是靜態變數,$d是普通變數。通過類例項的add()方法進行操作後,$c因為是和類有關,所以不管是哪個例項物件,操作它之後都會是共享的。而$d作為普通變數,它的作用域僅限制在當前這個例項物件中。因此,輸出的結果是:

c:2,d:2;
c:3,d:2;

最後,我們還是來複習一次self、parent和static關鍵字。

classE{
publicstaticfunctiontest(){
echo"ThisisEtest!";
}
}

classFextendsE{
publicstaticfunctiont(){
self::test();
parent::test();
static::test();
}

publicstaticfunctiontest(){
echo"ThisisFtest!";
}
}

F::t();

t()輸出的三個結果是什麼呢?詳情可以檢視之前的文章PHP中的Static