PHP中static关键字以及与self关键字的区别


Posted in PHP onJuly 01, 2015

概述

正在学习设计模式,之前有一篇文章关于单例模式的文章,重新读了这篇文章,发现对static关键字掌握不是很牢靠,重新温习一下。

static关键字

PHP手册里对static关键字的介绍如下:

Declaring class properties or methods as static makes them accessible without needing an instantiation of the class. A property declared as static cannot be accessed with an instantiated class object (though a static method can).

大体意思是,将类的属性和方法声明为静态以后,可以直接访问静态属性和方法,而不需要实例化对象。

PHP中静态成员和方法的特性如下:

1.静态成员不能通过类的实例访问,但是静态方法可以。
2.静态成员不能通过->运算符访问。
3.在静态方法的作用域中,不能出现$this关键字,也就是说不能在静态方法中访问普通的成员变量。
4.静态成员和方法,都可以通过类名直接访问,而无需实例化对象。

迟绑定(Late Static Bindings)

下面的内容摘自PHP手册:

自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。

准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。可用 get_called_class() 函数来得到被调用的方法所在的类名,static:: 则指出了其范围。

对该特性的理解,可以参考下手册中的例子

self vs static

用一个demo来直接说明self与static的区别。
self示例:

<?php

class Vehicle {

    protected static $name = 'This is a Vehicle';

    public static function what_vehicle() {

        echo get_called_class()."\n";                

        echo self::$name;

    }

}

class Sedan extends Vehicle {

    protected static $name = 'This is a Sedan';

}

Sedan::what_vehicle();

程序输出:
Sedan

This is a Vehicle

static示例:
<?php

class Vehicle {

    protected static $name = 'This is a Vehicle';

    public static function what_vehicle() {

        echo get_called_class()."\n";        

        echo static::$name;

    }

}

class Sedan extends Vehicle {

    protected static $name = 'This is a Sedan';

}

Sedan::what_vehicle();

程序输出:

Sedan

This is a Sedan

总结

看看上一篇文章,已经一个多月没更新过博客了,忙是一部分,主要的还是自己懈怠了,以后还得坚持。这篇文章写的也有点没感觉。

PHP 相关文章推荐
PHP session有效期问题
Apr 26 PHP
在PHP中使用反射技术的架构插件使用说明
May 18 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
Jun 23 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
Jun 09 PHP
PHP的error_reporting错误级别变量对照表
Jul 08 PHP
php curl登陆qq后获取用户信息时证书错误
Feb 03 PHP
PHP实现股票趋势图和柱形图
Feb 07 PHP
PHP 反射(Reflection)使用实例
May 12 PHP
php mysql 封装类实例代码
Sep 18 PHP
thinkphp分页集成实例
Jul 24 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
Aug 17 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
PHP单例模式详细介绍
Jul 01 #PHP
curl和libcurl的区别简介
Jul 01 #PHP
PHP+Ajax实时自动检测是否联网的方法
Jul 01 #PHP
PHP超全局数组(Superglobals)介绍
Jul 01 #PHP
PHP中的类型提示(type hinting)功能介绍
Jul 01 #PHP
7个鲜为人知却非常实用的PHP函数
Jul 01 #PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
Jul 01 #PHP
You might like
PHP测试程序运行时间的类
2012/02/05 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
关于JavaScript的一些看法
2009/05/27 Javascript
javascript 通用loading动画效果实例代码
2014/01/14 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
JS事件添加和移出的兼容写法示例
2016/06/20 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
详解Python验证码识别
2016/01/25 Python
Python算法应用实战之栈详解
2017/02/04 Python
tensorflow实现KNN识别MNIST
2018/03/12 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
python 深度学习中的4种激活函数
2020/09/18 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
日本乐天德国站:Rakuten.de
2019/05/16 全球购物
请说出几个常用的异常类
2013/01/08 面试题
大学自我鉴定范文
2013/12/26 职场文书
优秀教师获奖感言
2014/01/31 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
应聘英语教师求职信
2014/04/24 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
银行金融服务方案
2014/06/11 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
2014年民警工作总结
2014/11/25 职场文书
2019中小学生安全过暑期倡议书
2019/06/24 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
PostgreSQL数据库创建并使用视图以及子查询
2022/04/11 PostgreSQL