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在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
Aug 03 PHP
PHP文章按日期(月日)SQL归档语句
Nov 29 PHP
PHP中图片等比缩放的实例
Mar 24 PHP
关于php内存不够用的快速解决方法
Oct 26 PHP
php获取qq用户昵称和在线状态(实例分析)
Oct 27 PHP
PHP图像处理类库MagickWand用法实例分析
May 21 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
Dec 09 PHP
php redis实现对200w用户的即时推送
Mar 04 PHP
php生成网页桌面快捷方式
May 05 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 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加密解密的代码
2007/07/16 PHP
PHP中数组的分组排序实例
2014/06/01 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
javascript操作css属性
2013/12/30 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
Jquery异步提交表单代码分享
2015/03/26 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
js计算系统当前日期是星期几的方法
2016/07/14 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
Python中删除文件的程序代码
2011/03/13 Python
Python查看多台服务器进程的脚本分享
2014/06/11 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
python数据结构之链表详解
2017/09/12 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
如何基于python操作json文件获取内容
2019/12/24 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
美国独家设计师眼镜在线光学商店:Glasses Gallery
2017/12/28 全球购物
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
密封类可以有虚函数吗
2014/08/11 面试题
医学生毕业自我鉴定
2014/03/26 职场文书
辅导员评语
2014/05/04 职场文书
工作检讨书500字
2014/10/19 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
深入理解pytorch库的dockerfile
2022/06/10 Python