请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

App类为什么要继承Container

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

正在回答 回答被采纳积分+3

2回答

singwa 2019-11-04 23:47:35

亲爱的同学您好

https://img1.sycdn.imooc.com//szimg/5dc047dd0963d93417300752.jpg

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

0 回复 有任何疑惑可以回复我~
提问者 木祁3 2019-11-03 14:03:50

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 回复 有任何疑惑可以回复我~
  • App类中的 initialize方法中,$this->env->load($this->rootPath . '.env');相当于把env类的实例注册到了think\App Object对象的$instances(注册树)中。
    这句没看懂,咋个注册进去的???
    回复 有任何疑惑可以回复我~ 2021-07-15 15:42:54
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信