简单谈谈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学习之字符串比较和查找
Apr 17 PHP
第七章 php自定义函数实现代码
Dec 30 PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 PHP
Smarty局部缓存的几种方法简介
Jun 17 PHP
PHP实现取得HTTP请求的原文
Aug 18 PHP
PHP共享内存用法实例分析
Feb 12 PHP
php获取文件后缀的9种方法
Mar 22 PHP
PHP处理二进制数据的实现方法
Jun 13 PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 PHP
PHP7 其他语言层面的修改
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
php常用数组函数实例小结
2016/12/29 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
JavaScript事件委托原理与用法实例分析
2018/06/07 Javascript
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
举例详解Python中yield生成器的用法
2015/08/05 Python
简单的python后台管理程序
2017/04/13 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
Django rest framework基本介绍与代码示例
2018/01/26 Python
Numpy之文件存取的示例代码
2018/08/03 Python
用python实现k近邻算法的示例代码
2018/09/06 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
简历自荐信
2013/12/02 职场文书
2019年最新七夕唯美祝福语(60条)
2019/07/22 职场文书
Python中的嵌套循环详情
2022/03/23 Python