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

结果分析:

参考

官方手册:
http://www.php.net/manual/zh/language.oop5.static.php

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值