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用SAX解析XML的实现代码与问题分析
Aug 22 PHP
PHP详解ASCII码对照表与字符转换
Dec 05 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
Jul 29 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
php通过array_shift()函数移除数组第一个元素的方法
Mar 18 PHP
php程序内部post数据的方法
Mar 31 PHP
php结合curl实现多线程抓取
Jul 09 PHP
PHP实现全角字符转为半角方法汇总
Jul 09 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 PHP
PHP中一个有趣的preg_replace函数详解
Aug 15 PHP
解决laravel资源加载路径设置的问题
Oct 14 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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 n个不重复的随机数生成代码
2009/06/23 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
javascript中键盘事件用法实例分析
2015/01/30 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
详解微信JS-SDK选择图片遇到的坑
2018/08/15 Javascript
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
小程序多图列表实现性能优化的方法步骤
2019/05/28 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
2019/08/20 Javascript
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
在Django中使用Sitemap的方法讲解
2015/07/22 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
python读取ini配置文件过程示范
2019/12/23 Python
Python基于内置库pytesseract实现图片验证码识别功能
2020/02/24 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
岗位职责定义及内容
2013/11/08 职场文书
公司门卫岗位职责
2014/03/15 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
四风个人对照检查材料思想汇报
2014/09/25 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
邀请函的格式
2015/01/30 职场文书
员工聘用合同范本
2015/09/21 职场文书