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 相关文章推荐
在PHP3中实现SESSION的功能(一)
Oct 09 PHP
表格展示无限级分类(PHP版)
Aug 21 PHP
php树型类实例
Dec 05 PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
Mar 25 PHP
php判断一个数组是否为有序的方法
Mar 27 PHP
PHP实现的限制IP投票程序IP来源分析
May 04 PHP
php添加数据到xml文件的简单例子
Sep 08 PHP
php 多文件上传的实现实例
Oct 23 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
thinkPHP框架自动填充原理与用法分析
Apr 03 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
Jul 22 PHP
ThinkPHP 5.1 跨域配置方法
Oct 11 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的session cookie错误
2009/08/09 PHP
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
PHP pear安装配置教程
2016/05/14 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
js调用图片隐藏&amp;显示实现代码
2013/09/13 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
javascript-解决mongoose数据查询的异步操作
2016/12/22 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
2019/11/20 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
Python中的并发编程实例
2014/07/07 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
深入浅析python定时杀进程
2016/06/06 Python
JS设计模式之责任链模式实例详解
2018/02/03 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
使用canvas绘制贝塞尔曲线
2014/12/17 HTML / CSS
英文版销售经理个人求职信
2013/11/20 职场文书
学校政风行风整改方案
2014/10/25 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
贫困证明书范文
2015/06/16 职场文书
保护动物的宣传语
2015/07/13 职场文书
高三毕业感言
2015/07/30 职场文书
Appium中scroll和drag_and_drop根据元素位置滑动
2022/02/15 Python