简单谈谈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 相关文章推荐
实用函数10
Nov 08 PHP
php 执行系统命令的方法
Jul 07 PHP
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
Nov 27 PHP
php中随机显示图片的函数代码
Jun 23 PHP
PHP-redis中文文档介绍
Feb 07 PHP
PHP操作MongoDB GridFS 存储文件的详解
Jun 20 PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
PHP 搜索查询功能实现
Nov 29 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
Jun 19 PHP
php语法检查的方法总结
Jan 21 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 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 REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
PHP 变量的定义方法
2010/01/26 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
JS 面向对象之继承---多种组合继承详解
2016/07/10 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
python机器学习之决策树分类详解
2017/12/20 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
strstr()的简单实现
2013/09/26 面试题
市场开发与营销专业求职信
2013/12/31 职场文书
自荐信需注意事项
2014/01/25 职场文书
食品安全检查制度
2014/02/03 职场文书
幼儿园安全责任书
2014/04/14 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
医院保洁员管理制度
2015/08/05 职场文书
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python
MySQL数据库事务的四大特性
2022/04/20 MySQL