简单谈谈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新手上路(六)
Oct 09 PHP
PHP 存储文本换行实现方法
Jan 05 PHP
php生成随机密码的几种方法
Jan 17 PHP
PHP中输出转义JavaScript代码的实现代码
Apr 22 PHP
php URL验证正则表达式
Jul 19 PHP
php中使用接口实现工厂设计模式的代码
Jun 17 PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 PHP
php 魔术方法详解
Nov 11 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
Jun 06 PHP
PHP 实现页面静态化的几种方法
Jul 23 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 PHP
PHP中echo与print区别点整理
Mar 09 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
DIY实用性框形天线
2021/03/02 无线电
随机头像PHP版
2006/10/09 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
PHP的中使用非缓冲模式查询数据库的方法
2017/02/05 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
Angularjs的键盘事件的绑定
2017/07/27 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
Python基于Tkinter实现的记事本实例
2015/06/17 Python
numpy.random.seed()的使用实例解析
2018/02/03 Python
python按时间排序目录下的文件实现方法
2018/10/17 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
2020/02/15 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
学习十八大精神心得体会
2013/12/31 职场文书
商务经理岗位职责
2014/08/03 职场文书
工会趣味活动方案
2014/08/18 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
道歉的话语大全
2015/05/12 职场文书
导游词之新疆-喀纳斯
2019/10/10 职场文书
opencv 分类白天与夜景视频的方法
2021/06/05 Python
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js