简单谈谈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 20 PHP
php模拟用户自动在qq空间发表文章的方法
Jan 07 PHP
php隐藏实际地址的文件下载方法
Apr 18 PHP
thinkPHP基于ajax实现的菜单与分页示例
Jul 12 PHP
一个简单的php MVC留言本实例代码(必看篇)
Sep 22 PHP
php 输出json及显示json中的中文汉字详解及实例
Nov 09 PHP
php获取给定日期相差天数的方法分析
Feb 20 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
PHP xpath()函数讲解
Feb 11 PHP
PHP fprintf()函数用法讲解
Feb 16 PHP
PHP与Perl之间知识点区别整理
Mar 19 PHP
浅析PHP echo 和 print 语句
Jun 30 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安装全攻略:APACHE
2006/10/09 PHP
消息持续发送的完整例子
2006/10/09 PHP
收集的php编写大型网站问题集
2007/03/06 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
jQuery 一个图片切换的插件
2011/10/09 Javascript
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
AngularJS基础 ng-focus 指令简单示例
2016/08/01 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
JointJS流程图的绘制方法
2018/12/03 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
extract-text-webpack-plugin用法详解
2019/02/14 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
2018/05/24 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
python 模拟登录B站的示例代码
2020/12/15 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
新学期决心书
2014/03/11 职场文书
公路绿化方案
2014/05/12 职场文书
优秀大学生自荐信
2015/03/26 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
DIV CSS实现网页背景半透明效果
2021/12/06 HTML / CSS