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水印
Mar 16 PHP
PHP4和PHP5性能测试和对比 测试代码与环境
Aug 17 PHP
利用static实现表格的颜色隔行显示的代码
Sep 02 PHP
PHP HTML代码串截取代码
Dec 29 PHP
php 读取文件乱码问题
Feb 20 PHP
简单解决新浪SAE无法上传文件的问题
May 13 PHP
php实现只保留mysql中最新1000条记录
Jun 18 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
Aug 12 PHP
php实现分页功能的详细实例方法
Sep 29 PHP
laravel利用中间件做防非法登录和权限控制示例
Oct 21 PHP
PHP 实现 JSON 数据的编码和解码操作详解
Apr 22 PHP
php的单例模式及应用场景详解
Feb 27 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
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
JS实现div内部的文字或图片自动循环滚动代码
2013/04/19 Javascript
js中的this关键字详解
2013/09/25 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
在Swiper内如何制作CSS3动画效果示例代码
2017/12/07 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
原生js实现下拉选项卡
2019/11/27 Javascript
Openlayers测量距离与面积的实现方法
2020/09/25 Javascript
跟老齐学Python之总结参数的传递
2014/10/10 Python
python图像处理之反色实现方法
2015/05/30 Python
python删除服务器文件代码示例
2018/02/09 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
python3+pyqt5+itchat微信定时发送消息的方法
2019/02/20 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
Python shelve模块实现解析
2019/08/28 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
Python shutil模块用法实例分析
2019/10/02 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
自我鉴定思想方面
2013/10/07 职场文书
机关单位人员学雷锋心得体会
2014/03/10 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
2015年营销工作总结范文
2015/04/23 职场文书
2015年科协工作总结
2015/05/19 职场文书
个人欠条范本
2015/07/03 职场文书
实用求职信模板范文
2019/05/13 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang