简单谈谈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如何得到当前页和上一页的地址?
Nov 27 PHP
PHP实现多服务器session共享之NFS共享的方法
Mar 16 PHP
destoon官方标签大全
Jun 20 PHP
PHP魔术引号所带来的安全问题分析
Jul 15 PHP
ThinkPHP在新浪SAE平台的部署实例
Oct 31 PHP
PHP 绘制网站登录首页图片验证码
Apr 12 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
May 16 PHP
php is_executable判断给定文件名是否可执行实例
Sep 26 PHP
微信公众号开发之获取位置信息php代码
Jun 13 PHP
详解Laravel5.6 Passport实现Api接口认证
Jul 27 PHP
浅谈php调用python文件
Mar 29 PHP
php反射学习之依赖注入示例
Jun 14 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/25 PHP
使用php验证复选框有效性的示例
2013/11/13 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
JavaScript面向对象编程
2008/03/02 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
js自定义回调函数
2015/12/13 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
javascript实现简单打字游戏
2019/10/29 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
vuex入门最详细整理
2020/03/04 Javascript
v-slot和slot、slot-scope之间相互替换实例
2020/09/04 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
python反编译学习之字节码详解
2019/05/19 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
某公司面试题
2012/03/05 面试题
最新英语专业学生求职信范文
2013/09/21 职场文书
幼儿园数学教学反思
2014/02/02 职场文书
出生公证委托书
2014/04/03 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
Oracle 区块链表创建过程详解
2021/05/15 Oracle
Python预测分词的实现
2021/06/18 Python
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers