简单谈谈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基础知识介绍
Sep 17 PHP
php遍历数组的4种方法总结
Jul 05 PHP
php中出现空白页的原因及解决方法汇总
Jul 08 PHP
php实现mysql事务处理的方法
Dec 25 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
简单解析PHP程序的运行流程
Jun 23 PHP
详解Yii2.0 rules验证规则集合
Mar 21 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
Apr 03 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
PHP PDOStatement::fetchObject讲解
Feb 01 PHP
Yii框架页面渲染操作实例详解
Jul 19 PHP
php中对象引用和复制实例分析
Aug 14 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
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
php计算整个目录大小的方法
2015/06/19 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
php简单实现多维数组排序的方法
2016/09/30 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
thinkPHP框架自动填充原理与用法分析
2018/04/03 PHP
PHP实现的XXTEA加密解密算法示例
2018/08/28 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
基于jQuery实现表格的排序
2016/12/02 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
Python continue语句用法实例
2014/03/11 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
使用Python设计一个代码统计工具
2018/04/04 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
2018/06/13 Python
Python实现遗传算法(二进制编码)求函数最优值方式
2020/02/11 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
单位在职证明范本
2014/01/09 职场文书
公务员党员评议表自我鉴定
2014/09/14 职场文书
简易离婚协议书范本
2014/10/24 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
党小组评议意见
2015/06/02 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL