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 相关文章推荐
福利彩票幸运号码自动生成器
Oct 09 PHP
我的php学习笔记(毕业设计)
Feb 21 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
PHP入门经历和学习过程分享
Apr 11 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
php限制上传文件类型并保存上传文件的方法
Mar 13 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
Oct 17 PHP
详解EventDispatcher事件分发组件
Dec 25 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 PHP
PDO::commit讲解
Jan 27 PHP
PHP批斗大会之缺失的异常详解
Jul 09 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
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
PHP 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
jQuery总体架构的理解分析
2011/03/07 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
详解VueJs异步动态加载块
2017/03/09 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
JavaScript算法教程之sku(库存量单位)详解
2017/06/29 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
[15:41]教你分分钟做大人——灰烬之灵
2015/03/11 DOTA
python常见排序算法基础教程
2017/04/13 Python
python编程羊车门问题代码示例
2017/10/25 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
Proenza Schouler官方网站:纽约女装和配饰品牌
2019/01/03 全球购物
Linux常见面试题
2016/10/04 面试题
参观考察邀请函范文
2014/01/29 职场文书
班级活动策划书
2014/02/06 职场文书
六一儿童节演讲稿
2014/05/23 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
办公室岗位职责范本
2015/04/11 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
《大禹治水》教学反思
2016/02/22 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python