简单谈谈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 相关文章推荐
利用 window_onload 实现select默认选择
Oct 09 PHP
php文章内容分页并生成相应的htm静态页面代码
Jun 07 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
Jun 29 PHP
PHP+jQuery+Ajax实现用户登录与退出
Apr 27 PHP
PHP输入流php://input实例讲解
Dec 22 PHP
php7基于递归实现删除空文件夹的方法示例
Jun 15 PHP
[原创]php token使用与验证示例【测试可用】
Aug 30 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
php上传后台无法收到数据解决方法
Oct 28 PHP
laravel使用数据库测试注意事项
Apr 10 PHP
使用php的mail()函数实现发送邮件功能
Jun 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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
PHP 巧用数组降低程序的时间复杂度
2010/01/01 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
PHP加密技术的简单实现
2016/09/04 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
2018/08/21 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
JavaScript生成简单等差数列
2017/11/28 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
Python中使用socket发送HTTP请求数据接收不完整问题解决方法
2015/02/04 Python
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
五种Python转义表示法
2020/11/27 Python
HTML5网页录音和上传到服务器支持PC、Android,支持IOS微信功能
2019/04/26 HTML / CSS
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
爱国主义演讲稿
2014/05/07 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
学校百日安全活动总结
2015/05/07 职场文书
高三教师工作总结2015
2015/07/21 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers