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 相关文章推荐
Content-type 的说明
Oct 09 PHP
解决GD中文乱码问题
Feb 14 PHP
PHP 多进程 解决难题
Jun 22 PHP
如何设置mysql允许外网访问
Jun 04 PHP
yii的CURD操作实例详解
Dec 04 PHP
php实现汉字验证码和算式验证码的方法
Mar 07 PHP
php生成PDF格式文件并且加密
Jun 22 PHP
Yii2增删改查之查询 where参数详细介绍
Aug 08 PHP
PHP实现负载均衡下的session共用功能
Apr 17 PHP
php精度计算的问题解析
Jun 21 PHP
PHP 文件写入和读取操作实例详解【必看篇】
Nov 04 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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
PHPCMS的使用小结
2010/09/20 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
基于JavaScript实现树形下拉框
2016/08/10 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
基于javascript的Form表单验证
2016/12/29 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
Vue全家桶实践项目总结(推荐)
2017/11/04 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
详解JS中统计函数执行次数与执行时间
2018/09/04 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
2016/06/02 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
2018/01/04 Python
pandas string转dataframe的方法
2018/04/11 Python
用Python写一个模拟qq聊天小程序的代码实例
2019/03/06 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
基于Django快速集成Echarts代码示例
2020/12/01 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
工商管理专业职业生涯规划
2014/01/01 职场文书
大学生创业感言
2014/01/25 职场文书
总账会计岗位职责
2015/04/02 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python