资讯专栏INFORMATION COLUMN

PHP学习笔记——延迟静态绑定

whjin / 3319人阅读

摘要:于是为了解决这个问题,中引入了延迟静态绑定这个概念。延迟静态绑定这个代码与之前的几乎一致,不同点在于将换成了这个关键字,会解析为子类,而非父类,这样就可以解决上面遇到的问题,这就是的延迟静态绑定。

使用场景

先来观察以下代码:

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面向对象、模式与实践

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30284.html

相关文章

  • 【Laravel】Laravel 框架关键技术解析·读书笔记(一)

    摘要:判断是否存在构造函数,不存在直接实例化,存在则通过来获取输入函数,并有相应的方法解决依赖参数问题,实现依赖注入。 Laravel 框架关键技术解析·读书笔记(一) 第一章 入口文件 请求访问的入口文件,主要完成几部分工作,分别是: 自动加载函数的添加 服务器实例化与服务注册 路由加载 请求实例化与路由分发 相应生成与发送 其中,自动加载函数用于包含引用文件,改文件是composer...

    CocoaChina 评论0 收藏0
  • Laravel学习笔记之bootstrap源码解析

    摘要:总结本文主要学习了启动时做的七步准备工作环境检测配置加载日志配置异常处理注册注册启动。 说明:Laravel在把Request通过管道Pipeline送入中间件Middleware和路由Router之前,还做了程序的启动Bootstrap工作,本文主要学习相关源码,看看Laravel启动程序做了哪些具体工作,并将个人的研究心得分享出来,希望对别人有所帮助。Laravel在入口index...

    xiaoxiaozi 评论0 收藏0
  • php: static keyword

    摘要:函数内的变量静态变量的理解静态变量类型说明符是。静态变量虽在程序的整个执行过程中始终存在,但是在它作用域之外不能使用。静态变量并不是说其就不能改变值,不能改变值的量叫常量。 函数内的static变量 static静态变量的理解 静态变量 类型说明符是static。静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间...

    Astrian 评论0 收藏0
  • PHP静态方法和属性、延迟静态绑定

    摘要:静态方法和属性静态方法是以类作为作用域的函数。静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。因此静态方法和属性又被称为类变量和属性,也就不能在静态方法中使用伪变量。引入了延迟静态绑定的概念。 静态方法和属性 静态方法是以类作为作用域的函数。静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。如果修改了一个静态属性,那么这...

    rubyshen 评论0 收藏0
  • ThinkPhp学习笔记(一)

    摘要:如上为三个模块行为行为是在预先定义好的一个应用位置执行的一些操作。发生作用的位置称之为钩子,当应用程序运行到这个钩子的时候,就会被拦截下来,统一执行相关的行为。给某一个钩子绑定相关行为就成了一种类编程的思想。 ThinkPhp5.0 Composer: php世界里的包管理器 目录结构 project 应用部署目录 ├─application 应用目录(可设置) ...

    imtianx 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<