在php中 定义类用 关键字,php static关键字在类方法中的使用

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架构欢迎投递你的简书!

共同学习,共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值