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)步!