简单谈谈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 相关文章推荐
桌面中心(三)修改数据库
Oct 09 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
Oct 22 PHP
php设计模式 Composite (组合模式)
Jun 26 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
Dec 29 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
PHP 解决session死锁的方法
Jun 20 PHP
php利用单例模式实现日志处理类库
Feb 10 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
PHP实现数组递归转义的方法
Aug 28 PHP
php中mysql连接方式PDO使用详解
Feb 25 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
Mar 23 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
Apr 07 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
最省空间的计数器
2006/10/09 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
PHP编程一定要改掉的5个不良习惯
2020/09/18 PHP
function foo的原型与prototype属性解惑
2010/11/19 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
jQuery中调用WebService方法小结
2011/03/28 Javascript
Javascript Request获取请求参数如何实现
2012/11/28 Javascript
js 获取、清空input type="file"的值(示例代码)
2013/12/24 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
JavaScript中的bold()方法使用详解
2015/06/08 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
python根据出生年份简单计算生肖的方法
2015/03/27 Python
Django 使用logging打印日志的实例
2018/04/28 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
银行开业庆典方案
2014/02/06 职场文书
五一活动标语
2014/06/30 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL