前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >当面试关问你Laravel Facade,说出这几个关键词就可以

当面试关问你Laravel Facade,说出这几个关键词就可以

作者头像
猿哥
发布2019-12-24 17:22:41
8180
发布2019-12-24 17:22:41
举报
文章被收录于专栏:Web技术布道师Web技术布道师

关键词

  1. 概念
    • constructor方法
    • __set方法
    • property属性传值
    1. 门面(外观)设计模式定义,facade发音[fəˈsɑːd]
    2. 依赖注入(不需要所有的都需要手动new N多次)
    3. 依赖注入容器,比如springIoc或者Laravel App(容器来自动管理依赖和实例化对象)
  2. php相关语法及特性
    1. 给类起个别名: class_alias
    2. 自动加载器: spl_autoload_register && __autoload
    3. 魔术方法:__callStatic
    4. 接口: ArrayAccess
    5. static 静态延迟绑定
  3. laravel中已经实现的类
    1. Collection类实现/vendor/laravel/framework/src/Illuminate/Support/Collection.php
  4. 据说:facade来源于法语,本质可以理解为外表高大上,内部相对简单或者复杂。翻译成汉语叫城中的村儿。符合一些场景就是上级领导来审查,我们先把街道两边的建筑统一打理一下,这样领导(调用者)看到的就是一个和谐、繁荣的世界~~不过话说回来,laravel中的facade里里外外我觉得都很厉害(优雅)。

facade代码简单过

  1. index.php中注册HttpKernel,然后
    • $app(Illuminate/Foundation/Application.php)-> bootstrapWith (arrray $bootstrappers),注意这个bootstartps里面的数组对象是硬编码的(定义在BilibiiLaravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php->bootstrappers)
    • 然后每个facades类中都会有个bootstrap方法,类似每个provider都会有个register方法一样~
    • 以下代码及注释,来自于
代码语言:javascript
复制
/vendor/laravel/framework/src/Illuminate/Foundation/Application.php
public function bootstrapWith(array $bootstrappers)           {                
$this->hasBeenBootstrapped = true;                foreach ($bootstrappers as $bootstrapper) {                      $this['events']->dispatch('bootstrapping: ' . $bootstrapper, [$this]);                    /*依次从容器中拿出实例对象,然后依次调用对象的bootstrap方法。没错,没个bootstraper都有一个自己的bootstrap方法。他们在                    /vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap中有具体体现.注意他需要一个参数这个参数就是$this,                   不过你可能要问,这里是怎么直接make了呢?make的前提不得是bind或者instance啥的吗?简单介绍如下:                   1. 因为我们这里看的比如cache,router等facade,他们都是通过 xxxServiceProvider 的register方法去注册的                   2. 那么接着来的问题是,xxxServiceProvider又是什么时候调用的?细心的看一下当前这个类的构造方法,其中有                     - registerBaseBindings                     - registerBaseServiceProviders                     - registerCoreContainerAliase                   3. 然后在看一下当前这个类的register方法,有一个register方法,而调用者就是解析出来的provider了,                   4. 而每个provider都会有一个register方法,然后归根到底会有一个new方法                   5. 我这里简单加一行if判断,可以具体走到RegisterFacades方法*/                        if ($bootstrapper == 'Illuminate\Foundation\Bootstrap\RegisterFacades') {                           //  这个$this就是application对象,然后你可以去追一下RegisterFacades的bootstrap方法                           $this->make('Illuminate\Foundation\Bootstrap\RegisterFacades')->bootstrap($this);                       }                       $this->make($bootstrapper)->bootstrap($this);                        $this['events']->dispatch('bootstrapped: ' . $bootstrapper, [$this]);                       }
  1. RegisterFacades的bootstrap方法
    • AliasLoader的 register 方法,期间合并了app.php中的配置和composer中的配置,然后调用 prependToLoaderStack
    • 运用了 spl_autoload_register ,调用了AliasLoader自身的load方法,然后根据namespace和定义的别名去加载并renturn
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHP技术大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关键词
  • facade代码简单过
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档