简单谈谈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 Squid中可缓存的动态网页设计
Sep 17 PHP
深入解析PHP的引用计数机制
Jun 14 PHP
邮箱正则表达式实现代码(针对php)
Jun 21 PHP
浅析ThinkPHP的模板输出功能
Jul 01 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
Sep 29 PHP
Smarty模板简单配置与使用方法示例
May 23 PHP
关于PHP定时发送服务的解决办法
Apr 23 PHP
php封装单文件上传到数据库(路径)
Oct 15 PHP
PHP vsprintf()函数格式化字符串操作原理解析
Jul 14 PHP
PHP 实现缩略图
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
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
Express框架之connect-flash详解
2017/05/31 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
jQuery实现日历效果
2020/09/11 jQuery
js实现随机圆与矩形功能
2020/10/29 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
python中的字典使用分享
2016/07/31 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
python实现将excel文件转化成CSV格式
2018/03/22 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
NumPy统计函数的实现方法
2020/01/21 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
学生打架检讨书
2014/02/14 职场文书
土建专业大学生自荐信范文
2014/04/09 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
授权委托书格式范文
2014/08/02 职场文书
租房协议书范例
2014/10/14 职场文书
工伤事故处理协议书怎么写
2014/10/15 职场文书
百万英镑观后感
2015/06/09 职场文书
2019个人工作总结
2019/06/21 职场文书
MySQL 分页查询的优化技巧
2021/05/12 MySQL