PHP强化之19 - 静态 Static
一、简介
static关键字用来定义静态方法和属性,也可以用来定义静态变量以及后期静态绑定。
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
二、静态方法和属性
案例说明:
class Foo{
public static $my_static = 'foo'; //声明静态属性
public function staticFunc(){
return self::$my_static;
}
static public function test(){
return $this->$my_static; //致使错误,this 在静态方法中不可用
}
}
class UseFoo{
static public function index(){
$eof = "<br/>";
echo Foo::$my_static,1,$eof; //静态属性的调用方式
$foo = new Foo();
echo $foo->staticFunc(),2,$eof;
echo $foo->my_static,3,$eof; //报错,因为不能使用->方式调用静态属性
echo $foo::$my_static,4,$eof;
}
}
UseFoo::index(); //直接调用静态方法
注意:
1)由于静态方法不需要通过对象即可调用,所以伪变量$this 在静态方法中不可用。
2)静态属性不可以由对象通过->
操作符来访问。
3)静态方法可以通过类::方法名()
的形式调用,也可以通过$this->方法名()
的形式。
三、使用静态变量
变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。
案例说明:
function test($id)
{
static $count=0;
echo "{$id}=>count is :".$count."<br/>";
$count++;
}
test(1);
test(2);
test(3);
//结果如下:
1=>count is :0
2=>count is :1
3=>count is :2
注意:
1)静态变量仅初始化一次
2)每次执行函数该值会保留
3)static修改的变量是局部的,仅在函数内部有效
4)可以用来记录函数调用次数,从而可以在某些条件下终止递归
四、后期静态绑定
自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。
准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。可用 get_called_class() 函数来得到被调用的方法所在的类名,static:: 则指出了其范围。
该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。
官方文档: http://php.net/manual/zh/language.oop5.late-static-bindings.php
五、经典案例
1、写出如下程序的输出结果
$count = 5;
function get_count(){
static $count;
return $count++;
}
echo $count,"\n\r";
++$count;
echo get_count(),"\n\r";
echo get_count(),"\n\r";
结果如下:
root@Chan:/var/www/html# php demo25.php
5
1
结果分析:
