当前位置:首页 > 日记 > 正文

简单谈谈php延迟静态绑定

简单谈谈php延迟静态绑定

使用场景

先来观察以下代码:

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) { }

相关文章

Bootstrap3.3.7导航栏下拉菜单鼠标

Bootstrap3.3.7导航栏下拉菜单鼠标

导航栏,鼠标,下拉菜单,滑过,效果,Bootstrap是Twitter推出的一个用于前端开发的开源工具包。它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、…

Windows2008成功安装IIS的教程

Windows2008成功安装IIS的教程

教程,安装,电脑软件,IIS,Windows2008安装IIS方法1、右键点击 “计算机”,在弹出菜单中选择“管理”选项,在服务器管理器左侧界面点击 “角色”选项,如下图:2、点击“添加角色”按钮后,弹出如下界面3、…

Laravel中如何增加自定义全局函数

Laravel中如何增加自定义全局函数

自定义,全局函数,详解,电脑软件,Laravel,前言在日常开发工作中,有时候我们需要给 Laravel 添加一些自定义全局函数。当然,我们可以直接修改 Laravel 的 Helpers.php 文件来实现(这是极其不推荐的)。接下来我们讨论以下两种实现方式:无论是以下哪…

ps怎么抠图并和另一张合并?

ps怎么抠图并和另一张合并?

合并,抠图,电脑软件,ps,很多初学PS的小白都搞不清楚,怎么样把抠出来的图片移动到另外一张图片上。现在开心的雪宝把自己总结的经验分享给大家。希望对大家有帮助。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:20…

word怎么单独为正文设置页码word单

word怎么单独为正文设置页码word单

设置,正文,步骤,页码,电脑软件,  一篇word文档,有时要避开目录(为了演示此经验的重点,省去了生成目录过程),单独为正文设置页码,那么要怎样实现呢?下面小编来告诉你吧。word单独为正文设置页码的步骤首先将光标移到文档的首页首行,如图:word单…

iis7.5 500 - 内部服务器错误

iis7.5 500 - 内部服务器错误

错误,服务器,电脑软件,解决方法如下: 1、打开Internet 信息服务IIS管理器,然后双击“ASP”打开属性页, 然后展开“调试属性”,将“将错误发送到浏览器”的值改为“True”,然后点击右侧的“应用”以保存设置。 2、然后双击打开“错误页”属性页,然…

Visual Studio 2017创建.net stand

Visual Studio 2017创建.net stand

类库,解决方法,编译出错,原因,电脑软件,正式版上个月已经Release了,从那时到现在经常会收到更新提示,估计问题还不少吧!其中最吸引我的当然是.net standard与.net core。刚好最近接触.net standard项目,新建一个类库直接编译却出错!!立马心情不太…

如何让IIS支持 .iso 7z torrent 等

如何让IIS支持 .iso 7z torrent 等

文件下载,支持,7z,电脑软件,IIS,默让情况下面,iis是不允许没有注册到IIS 的 MIME文件下载,IIS默认支持哪些 MiME类型呢,我们可以在 IIS站点的属性中看得到。只是可惜一些常用的模式都是默认不支持的。如 .iso .7z bt种子等我们可以手动添加 M…

ReactJS实现表单的单选多选和反选

ReactJS实现表单的单选多选和反选

表单,单选,示例,多选,电脑软件,本文介绍了ReactJS实现表单的单选多选和反选的示例,分享给大家,希望对大家有所帮助。需求是对列表实现单选,反选和多选,全部清除的操作...... this.state = { //初始化空数组,表示已经选择的 selectedStores:…

JavaScript中利用构造器函数模拟类

JavaScript中利用构造器函数模拟类

模拟,构造器,函数,方法,电脑软件,前言本文小编带大家一起学习的是在 JavaScript 中使用构造器函数(construcor function)模拟类。下面话不多说,感兴趣的朋友们下面来一起看看吧。构造器函数简介你可以使用 ES6 的 class 关键字来实现类,不过我…

ps怎么复制图层样式? ps图层复制的

ps怎么复制图层样式? ps图层复制的

图层,方法,两种,样式,电脑软件,ps中制作好的图层样式直接复制到另一个图层中,该怎么复制呢?下面我们就来看看详细的教程。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、当你在一个图层上添加了图层样…

php 从一个数组中随机的取出若干个

php 从一个数组中随机的取出若干个

若干个,组中,个数,实例,电脑软件,第一种算法,CSDN上别人的想法 $num = 0; $array = array(1, 2, 3, 4, 5, 6, 7, 8, 9); $arr = array(); $g = 5; $tag = true; while ($tag) { $count = count($array); $t = rand(0, 1);…