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
php数组保存文本与文本反编成数组实例
Nov 13 PHP
Windows7下的php环境配置教程
Feb 28 PHP
PHP数组操作――获取数组最后一个值的方法
Apr 14 PHP
CodeIgniter多语言实现方法详解
Jan 20 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
Jul 06 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
基于PHP常用文件函数和目录函数整理
Aug 17 PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 PHP
PHP获取星期几的常用方法小结
Dec 18 PHP
PHP中的访问修饰符简单比较
Feb 02 PHP
laravel config文件配置全局变量的例子
Oct 13 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效率,提高php性能的一些方法
2011/03/24 PHP
php设置编码格式的方法
2013/03/05 PHP
PHP数据类型的总结分析
2013/06/13 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
PHP中对于浮点型的数据需要用不同的方法解决
2014/03/11 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
php接口技术实例详解
2016/12/07 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
三种Node.js写文件的方式
2016/03/08 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
Vue.use源码分析
2017/04/22 Javascript
Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)
2017/09/15 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
python numpy格式化打印的实例
2018/05/14 Python
python使用response.read()接收json数据的实例
2018/12/19 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
Python tkinter实现图片标注功能(完整代码)
2019/12/08 Python
Kneipp克奈圃美国官网:德国百年精油配方的传承
2018/02/07 全球购物
Zipadee-Zip襁褓过渡毯:Sleeping Baby
2018/12/30 全球购物
测试驱动开发的主要步骤是什么
2014/12/10 面试题
优秀教师工作感言
2014/02/16 职场文书
公司经理任命书
2014/06/05 职场文书
欢迎标语大全
2014/06/21 职场文书
小学班主任教育随笔
2015/08/15 职场文书
Python实现排序方法常见的四种
2021/07/15 Python