🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[danger]Container是App的父类 ## **属性** ``` //new \think\App()->http;或者new \think\App()-make('http')实例化的类都会被保存在$instances属性里 protected $instances ``` ## **方法** ~~~ //将实例化后的类保存进$instances属性 注意:这里的 new \think\App()->instance('wechat', new \think\Wechat() ); ~~~ ### **容器标识:app、cache等都是存在App下的bind属性里** ``` $app=new \think\App(); $app->app; $app->cache; $app->config; $app->console; $app->cookie; $app->db; $app->env; $app->event; $app->http; $app->lang; $app->log; $app->middleware; $app->request; $app->response; $app->route; $app->session; $app->validate; $app->view; $app->filesystem; $app->think\DbManager; $app->think\LogManager; $app->think\CacheManager; $app->Psr\Log\LoggerInterface;// 接口依赖注入 ``` >[info] `new \think\App()->http;`调用一个不存在的属性则触发继承与Container的_get()魔术方法 > __get()魔术方法则调用Container的`get()`方法 > get()方法用`has()`方法判断http标识或者Http类是否存在 > 存在则调用Container的`make()`方法 > make()方法进一步检查instances属性数组中是否含有http存在直接返回 > 不存在则调用bind属性中是否有http标识有则实例化标识所对应的http类 > 在bind属性的数组中未找到该标识则调用invokeClass 调用反射执行类的实例化 >[danger]由于__get方法的原因: > `$http = (new App())->make('http');` 等同于 `$http = (new App())->http;`