网络编程
位置:首页>> 网络编程>> php编程>> 简单谈谈php延迟静态绑定

简单谈谈php延迟静态绑定

作者:hebedich  发布时间:2024-06-05 15:42:33 

标签: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) { }
0
投稿

猜你喜欢

  • 1. 使用输入值初始化列表nums = []rows = eval(input("请输入行数:"))columns =
  • 写在前面:在做表格的时候,难免会碰到做统计的时候。由于在项目中涉及到做统计的功能比较简单,之后也就没有过多的去研究更复杂的,这里简单记录下。
  • 接触 Node.js 已有多年,一直喜欢它的单线程模型和异步IO特性,以及 JavaScript 语言本身的灵活性。同时,JavaScrip
  • 在这节教程中,我们将探讨PyQt5中的拖放操作。在计算机图形用户界面(GUI)中,拖放是在某个虚拟对象上点击并拖动到另一个位置或虚拟对象上的
  • 当各位在安装、重装时出现could not start the service mysql error:0原因: 卸载mysql时并没有完全
  • 本文先抓取网络上的表情图像,然后利用百度 AI 识别表情包上的说明文字,并利用表情文字重命名文件,这样当发表情包时,不需要逐个打开查找,直接
  • 本文实例讲述了Python中文竖排显示的方法。分享给大家供大家参考。具体如下:这里将中文竖排显示比如 衣食者人之生利也,然且犹尚有节,葬埋者
  • 在windows下写bat的时候,通过pause命令,可以暂停程序运行,例如经常见的程序会在终端提示”按任意键继续……”,用户在终端回车后程
  • queue介绍queue是python的标准库,俗称队列.可以直接import引用,在python2.x中,模块名为Queue。python
  • 前言在php开发过程中,获取文件扩展名是非常常见的需求。比如我们在上传文件的时候,首先需要判断文件类型是否为我们允许上传的类型。这个时候就需
  • 阅读上一篇:W3C优质网页小贴士(三)明智地选择 URI没有什么比走到你最喜欢的商店门口,却发现店门紧闭,而且没有看见店面搬迁告示这种事情还
  • 本文实例讲述了Python实现html转换为pdf报告(生成pdf报告)功能。分享给大家供大家参考,具体如下:1、先说下html转换为pdf
  • 概述在使用Typora写比较长的文章时,需要给章节编号,方便区分层次。如果手动编号,一旦章节顺序改变,很多章节的编号都需要一一手动修改,极其
  • 这段代码的效果具体是输入标题和内容,点击发布把消息发布出去,并使最新的消息始终在内容的最上面,代码为:<!DOCTYPE html&g
  • 相信很多小伙伴平时写python的时候都是需要调试程序的,出问题了,需要了解函数内部是怎么跑的,而这个时候很多人都会想到在疑惑的地方使用pr
  • 本文实例讲述了Python设计模式之备忘录模式原理与用法。分享给大家供大家参考,具体如下:备忘录模式(Memento Pattern):不破
  • 在程序中,经常需要将⼀组(通常是同为某个类型的)数据元素作为整体 管理和使⽤,需要创建这种元素组,⽤变量记录它们,传进传出函数等。 ⼀组数据
  • 本文实例为大家分享了python字符串循环左移的具体代码,供大家参考,具体内容如下字符串循环左移给定一个字符串S[0…N-1],要求把S的前
  • 用vue2.0开发做兼容时,你可能会发现vue项目在IE11版本浏览器中是空白的。。。看到空白的页面你可能会懵几秒钟,没事,下面我们就来解决
  • 在纯静态网站里,有时候会动态更新某个区域往会选择 Pjax(swup、barba.js)去处理,他们都是使用 ajax 和 pushStat
手机版 网络编程 asp之家 www.aspxhome.com