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分页显示制作详细讲解
Dec 05 PHP
php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
window+nginx+php环境配置 附配置搭配说明
Dec 29 PHP
php环境下利用session防止页面重复刷新的具体实现
Jan 09 PHP
PHP解决URL中文GBK乱码问题的两种方法
Jun 03 PHP
两千行代码的PHP学习笔记汇总
Oct 05 PHP
javascript some()函数用法详解
Nov 13 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
详解PHP防止直接访问.php 文件的实现方法
Jul 28 PHP
PHP getNamespaces()函数讲解
Feb 03 PHP
php ZipArchive实现多文件打包下载实例
Oct 31 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
帅气的琦玉老师
2020/03/02 日漫
php HandlerSocket的使用
2011/05/02 PHP
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
2021/02/26 PHP
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
jquery 输入框数字限制插件
2009/11/10 Javascript
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
js的2种继承方式详解
2014/03/04 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
js模拟百度模糊搜索的实例
2017/08/04 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
vue项目前端错误收集之sentry教程详解
2019/05/27 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
[04:00]黄浦江畔,再会英雄——完美世界DOTA2 TI9应援视频
2019/07/31 DOTA
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
FFrpc python客户端lib使用解析
2019/08/24 Python
python解析yaml文件过程详解
2019/08/30 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
Python数据存储之 h5py详解
2019/12/26 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
什么时候需要进行强制类型转换
2016/09/03 面试题
药学专业个人自我评价
2013/11/11 职场文书
网络维护中文求职信
2014/01/03 职场文书
高三英语复习计划
2015/01/19 职场文书
搞笑结婚保证书
2015/05/08 职场文书
开票证明
2015/06/23 职场文书
亲情作文之母爱
2019/09/25 职场文书
vscode内网访问服务器的方法
2022/06/28 Servers