美文网首页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