您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Laravel 5.5) 加载过程instance方法

2024/5/21 14:16:52发布38次查看
在bootstrap/app.php
/**  * 对于其中的instance register singleton 方法到时候单独拎出来说明  *   * 1.设置基础路径  * 2.使用instance 方法 绑定app 和illuminate\foundation\application类的关系  * 3.使用instance 方法 绑定container 和illuminate\foundation\application类的关系  * 4.app变量中注册事件服务eventserviceprovider  * 5.app变量中注册日志服务logserviceprovider  * 6.app变量中注册路由服务routingserviceprovider  * 7.别名的注册(vendor/laravel/framework/src/illuminate/foundation/application.php文件中的 registercorecontaineraliases 方法) */$app = new illuminate\foundation\application(    realpath(__dir__.'/../') );
实例化 vendor/laravel/framework/src/illuminate/foundation/application.php类  该类的魔术方法
public function __construct($basepath = null)     {        /**          * 如果有传地址  设置基础路径 设置           * path                 $this->path()          * path.base              $this->basepath()          * path.lang             $this->langpath()          * path.config             $this->configpath()          * path.public            $this->publicpath()          * path.storage            $this->storagepath()          * path.database        $this->databasepath()          * path.resources        $this->resourcepath()          * path.bootstrap         $this->bootstrappath()         */         if ($basepath) {            $this->setbasepath($basepath);         }        /**          * 注册 app 和container到 instances数组中         */         $this->registerbasebindings();        /**          * 注册eventserviceprovider logserviceprovider  routingserviceprovider         */         $this->registerbaseserviceproviders();        /**          * 设置核心类的别名         */         $this->registercorecontaineraliases();     }
查看注册 app 和container到 instances数组中
protected function registerbasebindings()     {        static::setinstance($this);        /**          * 由于初始化中  app没有添加到instances数组中 所以 不会执行build函数  只做了 instances数组中记录了app和$this         */         $this->instance('app', $this);        /**          * 由于初始化中  container没有添加到instances数组中 所以 不会执行build函数 只做了 instances数组中记录了app和$this         */         $this->instance(container::class, $this);     }
查看今天主要的方法 instance
流程图
public function instance($abstract, $instance)     {        /**          * 如果aliases 数组总存在  则游离abstractaliases 数组  删除其中的存在的值         */         $this->removeabstractalias($abstract);        /**          * 判断  在bindings aliases instances其中有一个存现  则返回true         */         $isbound = $this->bound($abstract);        /**          * 删除别名数组中对于的建         */         unset($this->aliases[$abstract]);        // we'll check to determine if this type has been bound before, and if it has         // we will fire the rebound callbacks registered with the container and it         // can be updated with consuming classes that have gotten resolved here.         /**          * 在instances 数组中添加对于的建         */         $this->instances[$abstract] = $instance;        /**          * 如果之前存在实例化 则运行         */         if ($isbound) {            $this->rebound($abstract);         }     }
第一个方法  removeabstractalias
/**      * remove an alias from the contextual binding alias cache.      *      * @param  string  $searched      * @return void     */     protected function removeabstractalias($searched)     {        /**          * 如果在别名数组中不存在则直接返回         */         if (! isset($this->aliases[$searched])) {            return;         }        /**          * 游离抽象别名 吧存在抽象类别名数组中的存在的删除          * @example abstractaliases = ['nameabstract'=>['aliase1','aliases2']]         */         foreach ($this->abstractaliases as $abstract => $aliases) {            foreach ($aliases as $index => $alias) {                if ($alias == $searched) {                    unset($this->abstractaliases[$abstract][$index]);                 }             }         }     }
第二个方法:  bound
/**      * determine if the given abstract type has been bound.      *      * @param  string  $abstract      * @return bool     */     public function bound($abstract)     {        return isset($this->bindings[$abstract]) ||               isset($this->instances[$abstract]) ||               $this->isalias($abstract);     }
第三个方法: rebound
/**      * fire the rebound callbacks for the given abstract type.      *      * @param  string  $abstract      * @return void     */     protected function rebound($abstract)     {        /**          * 主要实现的功能为 build 方法 实例化制定的类 并且返回该类           */         $instance = $this->make($abstract);        /**          * 查看reboundcallbacks 数组中是否存在该别名创建完成之后需要调用的方法数组           * 存在返回需要调用的方法数组   并且逐个执行         */         foreach ($this->getreboundcallbacks($abstract) as $callback) {            call_user_func($callback, $this, $instance);         }     }
以上就是laravel 5.5) 加载过程instance方法的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product