ホームページ > バックエンド開発 > PHPチュートリアル > Laravel 5.5) プロセスインスタンスメソッドのロード

Laravel 5.5) プロセスインスタンスメソッドのロード

PHP中文网
リリース: 2023-03-20 10:40:01
オリジナル
4394 人が閲覧しました

bootstrap/app.phpでvendor/laravel/framework/src/Illuminate/Foundation/Application.phpクラスをインスタンス化します

1

2

3

4

5

6

7

8

9

10

11

/**

 * 对于其中的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__.'/../')

);

ログイン後にコピー

このクラスのマジックメソッド

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

    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();

    }

ログイン後にコピー

登録されたアプリを表示し、コンテナー インスタンス配列内

1

2

3

4

5

6

7

    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);

    }

ログイン後にコピー


今日のメインメソッドインスタンスを表示

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

 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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

    /**

     * 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]);

                }

            }

        }

    }

ログイン後にコピー

2番目の方法:バウンド

1

2

3

4

5

6

7

8

    /**

     * 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);

    }

ログイン後にコピー

3番目の方法:リバウンド

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 /**

     * 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($abstractas $callback) {            call_user_func($callback$this$instance);

        }

    }

ログイン後にコピー

以上がLaravel 5.5) プロセスインスタンスメソッドのロードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート