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
php5.3中连接sqlserver2000的两种方法(com与ODBC)
Dec 29 PHP
使用PHP下载CSS文件中的图片的代码
Sep 24 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
分享3个php获取日历的函数
Sep 25 PHP
php简单实现sql防注入的方法
Apr 22 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
May 31 PHP
PHP PDOStatement::errorInfo讲解
Jan 31 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 PHP
Laravel登录失败次数限制的实现方法
Aug 26 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设计模式 Delegation(委托模式)
2011/06/26 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
JavaScript实现数字数组按照倒序排列的方法
2015/04/06 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
swiper4实现移动端导航栏tab滑动切换
2020/10/16 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
c++生成dll使用python调用dll的方法
2014/01/20 Python
Scrapy的简单使用教程
2017/10/24 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
2020/02/04 Python
几道PHP面试题
2013/04/14 面试题
爱情保证书大全
2014/04/29 职场文书
土地租赁意向书
2014/07/30 职场文书
政协调研汇报材料
2014/08/15 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
展览会邀请函
2015/02/02 职场文书
目标责任书格式范文
2015/05/11 职场文书
电影地道战观后感
2015/06/04 职场文书
怎样写工作总结啊!
2019/06/18 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书