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函数
Dec 06 PHP
paypal即时到账php实现代码
Nov 28 PHP
php debug 安装技巧
Apr 30 PHP
PHP中防止SQL注入方法详解
Dec 25 PHP
php使用array_search函数实现数组查找的方法
Jun 12 PHP
thinkPHP中create方法与令牌验证实例浅析
Dec 08 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
Nov 08 PHP
php Session无效分析资料整理
Nov 29 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
Mar 15 PHP
php获取excel文件数据
Apr 21 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 PHP
php修改word的实例方法
Nov 17 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 运行效率总结(提示程序速度)
2009/11/26 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
2017/07/03 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
JQuery中getJSON的使用方法
2010/12/13 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
微信小程序实现锚点功能
2019/11/20 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
python妙用之编码的转换详解
2017/04/21 Python
Python中super函数的用法
2017/11/17 Python
Python使用post及get方式提交数据的实例
2019/01/24 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
python 基于wx实现音乐播放
2020/11/24 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
酒店总经理欢迎词
2014/01/08 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
单位授权委托书范本
2014/09/26 职场文书