App类为什么要继承Container

来源:4-8 【Container容器类剖析】获取容器里面的实例分析

木祁3

2019-11-03

Container中的属性都是protected
然后App继承Container容器类。
App为什么要继承Container容器类?

写回答

2回答

singwa

2019-11-04

亲爱的同学您好

//img.mukewang.com/szimg/5dc047dd0963d93417300752.jpg

关键代码在这里, 这样做的话 会把 initialize初始化方法中 设置的一些 对象属性 再次绑定到APP类实例容器中。

0
0

木祁3

提问者

2019-11-03

Container类中的protected static $instance;是静态的。

App类继承Container类。那么App类和Container类都是维护同一个static $instance变量。

在代码运行的时候,最开始Container中$instance存储的是think\Container Object。

App类中的 initialize方法中,调用了static::setInstance($this);这个时候$instance中存储的对象变为think\App Object。

这个时候相当于Container::getInstance()和App::getInstance()得到的都是$instance中的值think\App Object。

App类中的 initialize方法中,$this->env->load($this->rootPath . '.env');相当于把env类的实例注册到了think\App Object对象的$instances(注册树)中。

Container::getInstance()->all()和App::getInstance()->all都能够查看到注册进来的env实例。

App继承Container类,在应用中获取注册树中的实例是通过Container::getinstance来获取的,但是注册env实例到注册树又是通过App类的 initialize来注册。

为什么App类继承Container。一会操作App类,一会儿操作Container类。没有搞懂为什么这样设计,有什么好处?

0
1
慕村5515322
App类中的 initialize方法中,$this->env->load($this->rootPath . '.env');相当于把env类的实例注册到了think\App Object对象的$instances(注册树)中。 这句没看懂,咋个注册进去的???
2021-07-15
共1条回复

BAT资深工程师解析Tp5+Tp6底层源码

一门课掌握主流Tp5+最新Tp6框架底层,拥抱新潮流

686 学习 · 145 问题

查看课程