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调用Oracle存储过程
Oct 09 PHP
php数组总结篇(一)
Sep 30 PHP
PHP开发需要注意的安全问题
Sep 01 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
PHP 如何获取二维数组中某个key的集合
Jun 03 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
php获取英文姓名首字母的方法
Jul 13 PHP
php三种实现多线程类似的方法
Oct 30 PHP
深入php内核之php in array
Nov 10 PHP
php 流程控制switch的简单实例
Jun 07 PHP
Laravel学习教程之本地化模块
Aug 18 PHP
php无限级评论嵌套实现代码
Apr 18 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 session有效期问题
2009/04/26 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
php修改指定文件后缀的方法
2014/09/11 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
原生js事件的添加和删除的封装
2014/07/01 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
2019/03/06 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
React实现评论的添加和删除
2020/10/20 Javascript
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
python轻松查到删除自己的微信好友
2016/01/10 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
python中csv文件的若干读写方法小结
2018/07/04 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
python+opencv实现阈值分割
2018/12/26 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
python使用matplotlib绘制雷达图
2019/10/18 Python
使用python从三个角度解决josephus问题的方法
2020/03/27 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
2012/12/30 HTML / CSS
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
九年级历史教学反思
2014/01/27 职场文书
大学生创业策划书
2014/02/02 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
关于安全的标语
2014/06/10 职场文书
放弃继承权公证书
2015/01/23 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫
把77A收信机改造成收音机
2022/04/05 无线电
Java 数组的使用
2022/05/11 Java/Android