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脚本的10个技巧(1)
Oct 09 PHP
PHP一些常用的正则表达式字符的一些转换
Jul 29 PHP
php strtotime 函数UNIX时间戳
Jan 14 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
Apr 09 PHP
PhpDocumentor 2安装以及生成API文档的方法
May 21 PHP
php+ajax无刷新分页实例详解
Dec 07 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
Mar 17 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
PHP递归删除多维数组中的某个值
Apr 17 PHP
php调用云片网接口发送短信的实现方法
Oct 25 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 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
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
2016/12/10 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
js实现表格字段排序
2014/02/19 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
详解js模板引擎art template数组渲染的方法
2018/10/09 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
js实现随机点名
2021/01/19 Javascript
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
python3.x上post发送json数据
2018/03/04 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
2018/04/22 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
2019/08/08 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
Python坐标线性插值应用实现
2019/11/13 Python
什么是python的必选参数
2020/06/21 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
Casadei卡萨蒂官网:意大利奢侈鞋履品牌
2017/10/28 全球购物
社区中秋节活动方案
2014/01/29 职场文书
保险内勤岗位职责
2014/04/05 职场文书
对照检查剖析材料
2014/09/30 职场文书
2014年宣传工作总结
2014/11/18 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
Node实现搜索框进行模糊查询
2021/06/28 Javascript
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS