简单谈谈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将数据导入到Foxmail
Oct 09 PHP
用PHP和ACCESS写聊天室(五)
Oct 09 PHP
怎样去阅读一份php源代码
Aug 21 PHP
php数组函数序列之in_array() 查找数组值是否存在
Oct 29 PHP
php 深入理解strtotime函数的使用详解
May 23 PHP
基于PHP文件操作的详解
Jun 05 PHP
php实现将字符串按照指定距离进行分割的方法
Mar 14 PHP
php获取客户端IP及URL的方法示例
Feb 03 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
Jul 20 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
PHP PDOStatement::setFetchMode讲解
Feb 03 PHP
浅谈PHP进程管理
Mar 08 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
PHP4实际应用经验篇(3)
2006/10/09 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
Python离线安装各种库及pip的方法
2020/11/28 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
小学生防溺水广播稿
2014/01/12 职场文书
采购经理岗位职责
2014/02/16 职场文书
主持人演讲稿
2014/05/13 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
论群众路线学习心得体会
2014/10/31 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
python中对列表的删除和添加方法详解
2022/02/24 Python