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

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

概念constructor方法

__set方法

property属性传值

门面(外观)设计模式定义,facade发音[fəˈsɑːd]

依赖注入(不需要所有的都需要手动new N多次)

依赖注入容器,比如springIoc或者Laravel App(容器来自动管理依赖和实例化对象)

php相关语法及特性

给类起个别名: class_alias

自动加载器: spl_autoload_register && __autoload

魔术方法: __callStatic

接口: ArrayAccess

static 静态延迟绑定

laravel中已经实现的类

Collection类实现/vendor/laravel/framework/src/Illuminate/Support/Collection.php

据说: facade来源于法语,本质可以理解为外表高大上,内部相对简单或者复杂。 翻译成汉语叫城中的村儿。 符合一些场景就是上级领导来审查,我们先把街道两边的建筑统一打理一下,这样领导(调用者)看到的就是一个和谐、繁荣的世界~~不过话说回来,laravel中的facade里里外外我觉得都很厉害(优雅)。

facade代码简单过

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方法一样~

以下代码及注释,来自于/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 == 'IlluminateFoundationBootstrapRegisterFacades') { // 这个$this就是application对象,然后你可以去追一下RegisterFacades的bootstrap方法 $this->make('IlluminateFoundationBootstrapRegisterFacades')->bootstrap($this); } $this->make($bootstrapper)->bootstrap($this); $this['events']->dispatch('bootstrapped: ' . $bootstrapper, [$this]); }

Http/Kernel.php的 handle ($request)-> sendRequestThroughRouter -> bootstrap

RegisterFacades的bootstrap方法

AliasLoader的 register 方法,期间合并了app.php中的配置和composer中的配置,然后调用 prependToLoaderStack

运用了 spl_autoload_register ,调用了AliasLoader自身的load方法,然后根据namespace和定义的别名去加载并renturn

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值