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 13 PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
May 07 PHP
PHP设计模式之代理模式的深入解析
Jun 13 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
Jun 19 PHP
浅析PHP中strlen和mb_strlen的区别
Aug 31 PHP
php实现对两个数组进行减法操作的方法
Apr 17 PHP
PHP超牛逼无限极分类生成树方法
May 11 PHP
深入理解PHP内核(二)之SAPI探究
Nov 10 PHP
php结合md5的加密解密算法实例
Sep 30 PHP
mac pecl 安装php7.1扩展教程
Oct 17 PHP
phpStorm2020 注册码
Sep 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
检测png图片是否完整的php代码
2010/09/06 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
php获取错误信息的方法
2015/07/17 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
JS动画效果代码3
2008/04/03 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
获取本机IP地址的实例(JavaScript / Node.js)
2017/11/24 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
使用原生JS实现火锅点餐小程序(面向对象思想)
2019/12/10 Javascript
浅析Python3爬虫登录模拟
2018/02/07 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
借款担保书范文
2014/05/13 职场文书
学校募捐倡议书
2014/05/14 职场文书
跳蚤市场口号
2014/06/13 职场文书
优秀纪检干部材料
2014/08/27 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
工作失职检讨书500字
2014/10/17 职场文书
中小学生学籍证明
2014/10/25 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
六年级语文教学反思
2016/03/03 职场文书
七年级作文之我的梦想
2019/10/16 职场文书