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延迟静态绑定则在执行阶段解析为当前类 即在编译阶段不解析,执行阶段解析为调用它的类