简单谈谈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可逆加密/解密函数分享
Sep 25 PHP
php递归获取目录内文件(包含子目录)封装类分享
Dec 25 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
php实现获取及设置用户访问页面语言类
Sep 24 PHP
跟我学Laravel之请求与输入
Oct 15 PHP
php实现两个数组相加的方法
Feb 17 PHP
非常重要的php正则表达式详解
Jan 04 PHP
Thinkphp和onethink实现微信支付插件
Apr 13 PHP
功能强大的php分页函数
Jul 20 PHP
PHP hebrev()函数用法讲解
Feb 21 PHP
laravel 实现登陆后返回登陆前的页面方法
Oct 03 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获取汉字的拼音(全部与首字母)
2013/06/27 PHP
php调整服务器时间的方法
2015/04/03 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
PHP 502bad gateway原因及解决方案
2020/11/13 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python群发邮件实例代码
2014/01/03 Python
Python中的默认参数详解
2015/06/24 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
在pycharm中显示python画的图方法
2019/08/31 Python
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
高中毕业生个人自我鉴定
2013/11/24 职场文书
人事部岗位职责范本
2014/03/05 职场文书
幼儿园教师的考核评语
2014/04/18 职场文书
关于责任的演讲稿
2014/05/20 职场文书
暑期教师培训方案
2014/06/07 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
慈善献爱心倡议书
2015/04/27 职场文书
红色故事汇观后感
2015/06/18 职场文书
2019垃圾分类宣传口号汇总
2019/08/16 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang
详解Redis主从复制实践
2021/05/19 Redis
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis