當面試關問你Laravel Facade,說出這幾個關鍵詞就能夠

關鍵詞

  1. 概念php

    1. 門面(外觀)設計模式定義,facade發音[fəˈsɑːd]
    2. 依賴注入(不須要全部的都須要手動new N屢次)laravel

      • constructor方法
      • __set方法
      • property屬性傳值
    3. 依賴注入容器,好比springIoc或者Laravel App(容器來自動管理依賴和實例化對象)
  2. php相關語法及特性spring

    1. 給類起個別名:class_alias
    2. 自動加載器:spl_autoload_register && __autoload
    3. 魔術方法:__callStatic
    4. 接口:ArrayAccess
    5. static 靜態延遲綁定
  3. laravel中已經實現的類bootstrap

    1. Collection類實現/vendor/laravel/framework/src/Illuminate/Support/Collection.php
  4. 聽說:facade來源於法語,本質能夠理解爲外表高大上,內部相對簡單或者複雜。翻譯成漢語叫城中的村兒。符合一些場景就是上級領導來審查,咱們先把街道兩邊的建築統一打理一下,這樣領導(調用者)看到的就是一個和諧、繁榮的世界~~不過話說回來,laravel中的facade裏裏外外我以爲都很厲害(優雅)。

facade代碼簡單過

  1. index.php中註冊HttpKernel,而後設計模式

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

      • $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.phpapp

        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]);
                              }
  2. RegisterFacades的bootstrap方法composer

    • AliasLoader的register方法,期間合併了app.php中的配置和composer中的配置,而後調用prependToLoaderStack
    • 運用了spl_autoload_register,調用了AliasLoader自身的load方法,而後根據namespace和定義的別名去加載並renturn
相關文章
相關標籤/搜索