php关键字static使用

php中static关键字使用:

情景1:静态变量

  使用static关键字定义静态变量

  静态变量:只存在于函数作用域内,也就是说,静态变量只存活在栈中。一般的函数内变量在函数结束后会释放,比如局部变量,但是静态变量却不会。就是说,下次再调用这个函数的时候,该变量的值会保留下来。

  示例代码:

   1 <?php 
   2 function test_1(){
   3     $num = 0;
   4     $num ++ ;
   5     echo $num;
   6 }
   7 function test_2(){
   8     static $num = 0;
   9     $num ++ ;
  10     echo $num;
  11 }
  12 
  13 test_1();echo ' || ';test_2();
  14 echo '<hr />';
  15 test_1();echo ' || ';test_2();
  16 echo '<hr />';
  17 test_1();echo ' || ';test_2();
  18 echo '<hr />';
  19 ?>

  上方代码输出结果:

    

  没有使用static关键字  则每次调用变量都会初始化为0,反之,则保留改变的数值  只有在第一次调用函数时候初始化;

情景2:类的静态属性和方法

  定义类的静态属性和方法时需要加上关键字static  可以实现直接使用类名调用属性和方法  不需要new关键字来实例化对象

  

 1 <?php 
 2     /**
 3     * 
 4     */
 5     class test_a
 6     {
 7         public $num = 0;
 8         public function test_1()
 9         {
10             $this->num = 100;
11             return 'num的值已经改变';
12         }
13     }
14     class test_b
15     {
16         public static $num = 0;
17         public static function test_1()
18         {
19             self::$num = 100;
20             return 'num的值已经改变';
21         }
22     }
23     $test = new test_a();
24     $test1 = new test_a();
25     echo $test->num,'/',$test->test_1(),'/',$test->num;
26     echo '<br />',$test1->num;
27 
28     echo '<hr>';
29     echo test_b::$num,'/',test_b::test_1(),'/',test_b::$num;
30 
31 ?>

   结果如下:

   

  静态方法和属性  直接用类名加上 :: 调用方法和属性  不需要 实例化;

  类内调用自身的方法和属性  静态和非静态的也是有区别的。

情景3:方法的延迟静态绑定(类继承时使用)

    

 1 class Father {
 2         protected static $num = 100;
 3 
 4         public function getNewFather()
 5         {
 6                return new self();
 7         }
 8 
 9             public function getNewCaller()
10             {
11             return new static();
12         }
13     }
14     /**
15     * 
16     */
17     class Son extends Father
18     {
19         
20         public function __construct()
21         {
22             # code...
23         }
24     }
25 
26 
27     $f = new Father();
28     $g = new Son();
29     echo '<br/>';var_dump($f -> getNewFather());
30     echo '<br/>';var_dump($f -> getNewCaller());
31     echo '<hr/>';
32     echo '<br/>';var_dump($g -> getNewFather());
33     echo '<br/>';var_dump($g -> getNewCaller());

 

  运行结果:

  

  self在编译阶段解析为当前类  即self 所在的类

  static延迟静态绑定则在执行阶段解析为当前类  即在编译阶段不解析,执行阶段解析为调用它的类

 

 

 

 

 

  

 

  

 

posted @ 2018-03-22 19:31  初心未泯  阅读(153)  评论(0编辑  收藏  举报