简单谈谈php延迟静态绑定


Posted in PHP onJanuary 26, 2016

使用场景

先来观察以下代码:

abstract class base {
  //do sth
}
class aClass extends base{
  public static function create(){
    return new aClass();
  } 
}
class bClass extends base{
  public static function create(){
    return new bClass();
  }
}
var_dump(aClass::create());
var_dump(bClass::create());

输出:

object(aClass)#1 (0) { } object(bClass)#1 (0) { }

以上aClass和bClass继承于base这个抽象类,但是在两个子类中同时实现了create()这个静态方法。遵从oop思想,这种重复代码应该放在base这个父类中实现。

改进代码

abstract class base {
  public static function create(){
    return new self();
  } 
}
class aClass extends base{
}
class bClass extends base{
}
var_dump(aClass::create());
var_dump(bClass::create());

现在的代码看起来好像已经符合我们之前的想法,将create()方法放在父类里共用了,那我们来运行下看会发生什么。

Cannot instantiate abstract class base in ...

很遗憾,代码好像并没有按照我们预想的那样去运行,父类中的self()被解析为base这个父类,并非继承与他的子类。于是为了解决这个问题,php5.3中引入了延迟静态绑定这个概念。

延迟静态绑定

abstract class base {
  public static function create(){
    return new static();
  } 
}
class aClass extends base{
}
class bClass extends base{
}
var_dump(aClass::create());
var_dump(bClass::create());

这个代码与之前的几乎一致,不同点在于将self换成了static这个关键字,static会解析为子类,而非父类,这样就可以解决上面遇到的问题,这就是php的延迟静态绑定。

最后,运行一下代码,得到了最终想要的结果。

object(aClass)#1 (0) { } object(bClass)#1 (0) { }
PHP 相关文章推荐
PHP的宝库目录--PEAR
Oct 09 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
Oct 17 PHP
浅析php过滤html字符串,防止SQL注入的方法
Jul 02 PHP
PHP中exec函数和shell_exec函数的区别
Aug 20 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
Mar 21 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
May 08 PHP
PHP使用new StdClass()创建空对象的方法分析
Jun 06 PHP
PHP图片水印类的封装
Jul 06 PHP
PHP Include文件实例讲解
Feb 15 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
May 08 PHP
php7 新增功能实例总结
May 25 PHP
php制作的简单验证码识别代码
Jan 26 #PHP
php文档工具PHP Documentor安装与使用方法
Jan 25 #PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 #PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
Jan 25 #PHP
PHP实现的oracle分页函数实例
Jan 25 #PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 #PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 #PHP
You might like
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
php分页查询的简单实现代码
2017/03/14 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
浅谈JavaScript数据类型
2015/03/03 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
七夕情人节丘比特射箭小游戏
2015/08/20 Javascript
js严格模式总结(分享)
2016/08/22 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
pytyon 带有重复的全排列
2013/08/13 Python
Python安装第三方库的3种方法
2015/06/21 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
python批量生成身份证号到Excel的两种方法实例
2021/01/14 Python
SQL Server面试题
2016/10/17 面试题
夜大毕业自我鉴定
2013/10/11 职场文书
医药代表个人求职信范本
2013/12/19 职场文书
早会主持词
2014/03/17 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
先进教师事迹材料
2014/12/16 职场文书
于丹论语心得观后感
2015/06/15 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
讨论nginx location 顺序问题
2022/05/30 Servers