资讯专栏INFORMATION COLUMN

php: static keyword

Astrian / 1902人阅读

摘要:函数内的变量静态变量的理解静态变量类型说明符是。静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。静态变量并不是说其就不能改变值,不能改变值的量叫常量。

函数内的static变量
static静态变量的理解
静态变量 类型说明符是static。
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。
另外,属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。
静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
来源:http://blog.csdn.net/u0121118...

函数内静态变量

static usage
1,请看下面这个例子:

function doStuff(&$cache) {
    static $cache = null;

    if ($cache === null) {
        echo $cache = "%heavy database stuff or something%";
    }
}
$cache = "not null";
doStuff($cache);

// Output
%heavy database stuff or something%

从上面的例子可以看出,static关键字影响了引用传递,即使我们使用了&来试图改变变量$cache的值和地址,仍然不影响doStuff()函数中的if判断;

而且,在doStuff()函数中,静态变量$cache并不是不可改变的,$cachenull变成了%heavy database stuff or something%;

类中的静态方法和属性

我们把类当成生成对象的模板,把对象作为活动组件,实例化一个类,得到一个对象,然后访问这个对象的方法和属性。
例如 $foo = new Foo(); $foo就是类Foo实例化后的对象。

静态方法是以类作为作用域的函数,我们可以不经实例化,直接访问静态方法.例如:

class Foo()
{
    public static function a(){}
}

// 访问a();
Foo::a();

静态方法不能访问这个类中的普通属性和方法,因为那些属性和方法属于一个对象,而静态方法和属性又称为类变量的方法。

在当前类(非子类)中访问静态方法或属性使用self::method()
note: self可以调用父类的静态方法和属性;

延迟静态绑定

先看个例子

header("Content-type: text/html; charset=utf-8");
class A 
{
    public static function aa()
    {
        echo "非延迟静态绑定
"; } public static function bb() { echo self::aa(); // Output 非延迟静态绑定 echo static::aa(); // Output 延迟静态绑定 } } class B extends A { public static function aa() { echo "延迟静态绑定"; } public static function cc() { echo self::bb(); } } B::bb(); // Output 非延迟静态绑定 延迟静态绑定

使用self关键字,指是当前类(A),因此获取的也就是类Aaa()方法的返回值;
php5.3之后,我们可以使用static来获取子类的aa()方法,它指的的被调用的类。

总结:

static关键字的延迟绑定有很多用途,一般在项目中可边做边总结。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23107.html

相关文章

  • PHP实现支付宝小程序发送模板消息的工具类

    摘要:背景最近公司项目一直在围绕着支付宝做应用开发,为了能保证消息能够及时的给用户传递,因此需要开发模板消息的功能,而小程序的模板消息也是最快捷的通知方式事先准备请仔细阅读支付宝模板消息发送指引模板消息指引仔细阅读用户的授权文档,用户授权的详细的 背景 最近公司项目一直在围绕着支付宝做应用开发,为了能保证消息能够及时的给用户传递,因此需要开发模板消息的功能,而小程序的模板消息也是最快捷的通知...

    n7then 评论0 收藏0
  • 小程序高级实战开发

    摘要:微信基本组件的高级解读数据绑定,记住使用列表,使用,同时设置好。在使用组件,尤其是组件套组件时,特别注意此类事件。不设置该方法,页面不支持分享如何发送模板消息小程序需要做什么在小程序段必须使用,获取到并和其他数据一起传给服务器。 showImg(https://segmentfault.com/img/remote/1460000014423859); 1.微信基本组件的高级解读 数...

    Ajian 评论0 收藏0
  • 小程序高级实战开发

    摘要:微信基本组件的高级解读数据绑定,记住使用列表,使用,同时设置好。在使用组件,尤其是组件套组件时,特别注意此类事件。不设置该方法,页面不支持分享如何发送模板消息小程序需要做什么在小程序段必须使用,获取到并和其他数据一起传给服务器。 showImg(https://segmentfault.com/img/remote/1460000014423859); 1.微信基本组件的高级解读 数...

    hellowoody 评论0 收藏0
  • 小程序高级实战开发

    摘要:微信基本组件的高级解读数据绑定,记住使用列表,使用,同时设置好。在使用组件,尤其是组件套组件时,特别注意此类事件。不设置该方法,页面不支持分享如何发送模板消息小程序需要做什么在小程序段必须使用,获取到并和其他数据一起传给服务器。 showImg(https://segmentfault.com/img/remote/1460000014423859); 1.微信基本组件的高级解读 数...

    laznrbfe 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<