登录  /  注册

Laravel 5.5) 加载过程instance方法

PHP中文网
发布: 2018-02-18 14:04:45
原创
3997人浏览过

在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/<a style="color:#f60; text-decoration:underline;" href="https://www.php.cn/zt/15729.html" target="_blank">laravel</a>/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-&gt;path()
         * path.base              $this-&gt;basePath()
         * path.lang             $this-&gt;langPath()
         * path.config             $this-&gt;configPath()
         * path.public            $this-&gt;publicPath()
         * path.storage            $this-&gt;storagePath()
         * path.database        $this-&gt;databasePath()
         * path.resources        $this-&gt;resourcePath()
         * path.bootstrap         $this-&gt;bootstrapPath()         */
        if ($basePath) {            $this-&gt;setBasePath($basePath);
        }        /**
         * 注册 app 和container到 instances数组中         */
        $this-&gt;registerBaseBindings();        /**
         * 注册EventServiceProvider LogServiceProvider  RoutingServiceProvider         */
        $this-&gt;registerBaseServiceProviders();        /**
         * 设置核心类的别名         */
        $this-&gt;registerCoreContainerAliases();
    }
登录后复制

查看注册 app 和container到 instances数组中

    protected function registerBaseBindings()
    {        static::setInstance($this);        /**
         * 由于初始化中  app没有添加到instances数组中 所以 不会执行build函数  只做了 instances数组中记录了app和$this         */
        $this-&gt;instance('app', $this);        /**
         * 由于初始化中  Container没有添加到instances数组中 所以 不会执行build函数 只做了 instances数组中记录了app和$this         */
        $this-&gt;instance(Container::class, $this);
    }
登录后复制

 

 


 

查看今天主要的方法 instance

流程图

 public function instance($abstract, $instance)
    {        /**
         * 如果aliases 数组总存在  则游离abstractAliases 数组  删除其中的存在的值         */
        $this-&gt;removeAbstractAlias($abstract);        /**
         * 判断  在bindings aliases instances其中有一个存现  则返回true         */
        $isBound = $this-&gt;bound($abstract);        /**
         * 删除别名数组中对于的建         */
        unset($this-&gt;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-&gt;instances[$abstract] = $instance;        /**
         * 如果之前存在实例化 则运行         */
        if ($isBound) {            $this-&gt;rebound($abstract);
        }
    }
登录后复制

 

第一个方法  removeAbstractAlias

    /**
     * Remove an alias from the contextual binding alias cache.
     *
     * @param  string  $searched
     * @return void     */
    protected function removeAbstractAlias($searched)
    {        /**
         * 如果在别名数组中不存在则直接返回         */
        if (! isset($this-&gt;aliases[$searched])) {            return;
        }        /**
         * 游离抽象别名 吧存在抽象类别名数组中的存在的删除
         * @example abstractAliases = ['nameabstract'=&gt;['aliase1','aliases2']]         */
        foreach ($this-&gt;abstractAliases as $abstract =&gt; $aliases) {            foreach ($aliases as $index =&gt; $alias) {                if ($alias == $searched) {                    unset($this-&gt;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-&gt;bindings[$abstract]) ||               isset($this-&gt;instances[$abstract]) ||               $this-&gt;isAlias($abstract);
    }
登录后复制

 

第三个方法: rebound

 /**
     * Fire the "rebound" callbacks for the given abstract type.
     *
     * @param  string  $abstract
     * @return void     */
    protected function rebound($abstract)
    {        /**
         * 主要实现的功能为 build 方法 实例化制定的类 并且返回该类 
         */
        $instance = $this-&gt;make($abstract);        /**
         * 查看reboundCallbacks 数组中是否存在该别名创建完成之后需要调用的方法数组 
         * 存在返回需要调用的方法数组   并且逐个执行         */
        foreach ($this-&gt;getReboundCallbacks($abstract) as $callback) {            call_user_func($callback, $this, $instance);
        }
    }
登录后复制

 

以上就是Laravel 5.5) 加载过程instance方法的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号