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版
Oct 09 PHP
php xml文件操作实现代码(二)
Mar 20 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
May 23 PHP
php实现把url转换迅雷thunder资源下载地址的方法
Nov 07 PHP
CentOS安装php v8js教程
Feb 26 PHP
php去除字符串中空字符的常用方法小结
Mar 17 PHP
PHP封装的多文件上传类实例与用法详解
Feb 07 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
Yii框架响应组件用法实例分析
Sep 04 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
Sep 27 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 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
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
2016/01/05 PHP
Yii数据读取与跳转参数传递用法实例分析
2016/07/12 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
类似CSDN图片切换效果脚本
2009/09/17 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
js DOM 元素ID就是全局变量
2012/09/20 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
JS随机密码生成算法
2019/09/23 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
详解Python中DOM方法的动态性
2015/04/11 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
python 实现两个npy档案合并
2020/07/01 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
工程采购员岗位职责
2014/03/09 职场文书
骨干教师考核方案
2014/05/09 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书