php static關(guān)鍵字在類方法中的使用

static關(guān)鍵字大家都知道是申明靜態(tài)變量使用的,那么在類方法里面聲明靜態(tài)變量又會有什么不同的作用呢。

先來看一下定義:靜態(tài)變量僅在局部函數(shù)域中存在,但當(dāng)程序執(zhí)行離開此作用域時(shí),其值并不丟失,那在類里是不是也是如此呢
例子:是否會輸出每個(gè)對象不一樣的結(jié)果呢?
<?php
class sample_class
{
  public function func_having_static_var($x = NULL)
  {
    static $var = 0;
    if ($x === NULL)
    { return $var; }
    $var = $x;
  }
}

$a = new sample_class();
$b = new sample_class();

echo $a->func_having_static_var()."\n";
echo $b->func_having_static_var()."\n";
$a->func_having_static_var(3);

echo $a->func_having_static_var()."\n";
echo $b->func_having_static_var()."\n";
以上的例子不會達(dá)到預(yù)想的結(jié)果,這是為什么呢?
解釋:如果您將一個(gè)變量聲明為函數(shù)內(nèi)的靜態(tài)變量,那么它將對整個(gè)類及其所有實(shí)例進(jìn)行靜態(tài)處理,而不是針對每個(gè)對象。
修改:
class sample_class
{ protected $var = 0; 
  function func($x = NULL)
  { $this->var = $x; }
}
如果是派生類繼承父類的靜態(tài)變量的方法這種情況呢?
<?php
class Derived extends Base {}

$base1 = new Base();
$base2 = new Base();
$derived1 = new Derived();
$derived2 = new Derived();

$base1->test(3);
$base2->test(4);
$derived1->test(5);
$derived2->test(6);

var_dump([ $base1->test(), $base2->test(), $derived1->test(), $derived2->test() ]);

# => array(4) { [0]=> int(7) [1]=> int(7) [2]=> int(11) [3]=> int(11) }
解釋:
如果在類的方法中有一個(gè)靜態(tài)變量,那么該類的所有直接實(shí)例都共享一個(gè)靜態(tài)變量。


但是,如果您創(chuàng)建一個(gè)派生類,那么派生類的所有直接實(shí)例將共享一個(gè),但是不同的,方法中的靜態(tài)變量的副本。


換句話說,方法中的靜態(tài)變量綁定到類(而不是實(shí)例)。每個(gè)子類都擁有該變量的副本,以便在其實(shí)例中共享。


換句話說,當(dāng)您創(chuàng)建派生類時(shí),它“似乎”在基類中創(chuàng)建了一個(gè)方法的副本,并在這些方法中創(chuàng)建了靜態(tài)變量的副本。
再來看另外一個(gè)例子:
<?php
class A {
    function Z() {
        static $count = 0;        
        printf("%s: %d\n", get_class($this), ++$count);
    }
}

class B extends A {}

$a = new A();
$b = new B();
$a->Z();
$a->Z();
$b->Z();
$a->Z();
//以上例子會輸出:
A: 1
A: 2
B: 1
A: 3
解釋:
靜態(tài)變量不支持繼承。讓類A有一個(gè)帶有靜態(tài)變量的函數(shù)Z。讓B類擴(kuò)展A類,其中函數(shù)Z不被覆蓋。將創(chuàng)建兩個(gè)靜態(tài)變量,一個(gè)用于類A,一個(gè)用于B類。

大家在類方法里定義靜態(tài)變量時(shí)要注意了,謝謝大家查看我的簡書,可以關(guān)注我創(chuàng)建的模塊php架構(gòu)歡迎投遞你的簡書!
共同學(xué)習(xí),共同進(jìn)步!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,727評論 18 399
  • 今天好多了,不會像前兩天那樣只能躺在床上,今天可以陪兒子一起玩了,走路感覺要輕松一些了,可以走了,只是坐下,起來不...
    緒英閱讀 118評論 1 2
  • 人生的路不白走,每一步都算數(shù) 寶貝!選擇走創(chuàng)業(yè)這條路,真心不易!我知道你下了很大的決心,內(nèi)心里無數(shù)次給自己勇氣,說...
  • 人生就是一輩子,一輩子說長不長,說短不短。生不帶來死不帶去,哇的一聲來到這個(gè)世上,管子一拔就離開這個(gè)世上。沒...
    微微情緣閱讀 808評論 0 2
  • 內(nèi)容簡介與目錄 上一章:冒充兄弟人生改,認(rèn)可彩霞實(shí)無奈 第30章:走街區(qū)熟記市貌,逛商場巧遇老黑 又是星期日,孫成...
    扶青閱讀 629評論 1 8

友情鏈接更多精彩內(nèi)容