static关键字大家都知道是申明静态变量使用的,那么在类方法里面声明静态变量又会有什么不同的作用呢。
先来看一下定义:静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失,那在类里是不是也是如此呢
例子:是否会输出每个对象不一样的结果呢?
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";
以上的例子不会达到预想的结果,这是为什么呢?
解释:如果您将一个变量声明为函数内的静态变量,那么它将对整个类及其所有实例进行静态处理,而不是针对每个对象。
修改:
class sample_class
{ protected $var = 0;
function func($x = NULL)
{ $this->var = $x; }
}
如果是派生类继承父类的静态变量的方法这种情况呢?
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) }
解释:
如果在类的方法中有一个静态变量,那么该类的所有直接实例都共享一个静态变量。
但是,如果您创建一个派生类,那么派生类的所有直接实例将共享一个,但是不同的,方法中的静态变量的副本。
换句话说,方法中的静态变量绑定到类(而不是实例)。每个子类都拥有该变量的副本,以便在其实例中共享。
换句话说,当您创建派生类时,它“似乎”在基类中创建了一个方法的副本,并在这些方法中创建了静态变量的副本。
再来看另外一个例子:
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
解释:
静态变量不支持继承。让类A有一个带有静态变量的函数Z。让B类扩展A类,其中函数Z不被覆盖。将创建两个静态变量,一个用于类A,一个用于B类。
大家在类方法里定义静态变量时要注意了,谢谢大家查看我的简书,可以关注我创建的模块php架构欢迎投递你的简书!
共同学习,共同进步!