美文网首页php架构
php static关键字在类方法中的使用

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

作者: 夕阳下的浪子 | 来源:发表于2018-05-06 09:35 被阅读0次

static关键字大家都知道是申明静态变量使用的,那么在类方法里面声明静态变量又会有什么不同的作用呢。

先来看一下定义:静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失,那在类里是不是也是如此呢
例子:是否会输出每个对象不一样的结果呢?
<?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";
以上的例子不会达到预想的结果,这是为什么呢?
解释:如果您将一个变量声明为函数内的静态变量,那么它将对整个类及其所有实例进行静态处理,而不是针对每个对象。
修改:
class sample_class
{ protected $var = 0; 
  function func($x = NULL)
  { $this->var = $x; }
}
如果是派生类继承父类的静态变量的方法这种情况呢?
<?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) }
解释:
如果在类的方法中有一个静态变量,那么该类的所有直接实例都共享一个静态变量。


但是,如果您创建一个派生类,那么派生类的所有直接实例将共享一个,但是不同的,方法中的静态变量的副本。


换句话说,方法中的静态变量绑定到类(而不是实例)。每个子类都拥有该变量的副本,以便在其实例中共享。


换句话说,当您创建派生类时,它“似乎”在基类中创建了一个方法的副本,并在这些方法中创建了静态变量的副本。
再来看另外一个例子:
<?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
解释:
静态变量不支持继承。让类A有一个带有静态变量的函数Z。让B类扩展A类,其中函数Z不被覆盖。将创建两个静态变量,一个用于类A,一个用于B类。

大家在类方法里定义静态变量时要注意了,谢谢大家查看我的简书,可以关注我创建的模块php架构欢迎投递你的简书!
共同学习,共同进步!

相关文章

网友评论

    本文标题:php static关键字在类方法中的使用

    本文链接:https://www.haomeiwen.com/subject/jgvyrftx.html