Laravel 執行流程(一)之自動加載

定位

  • 從 public/index.php 定位到 bootstrap/autoload.php
  • 從 bootstrap/autoload.php 定位到 vendor/autoload.php
  • 從 vendor/autoload.php 定位到 __DIR__ . '/composer' . '/autoload_real.php';

定位完畢,你會看到這樣的代碼:php

return ComposerAutoloaderInit2bf9ae5262a23b284c9433508d41d77f::getLoader();web

ComposerAutoloaderInit2bf9ae5262a23b284c9433508d41d77f 簡稱本類。bootstrap

那咱們就從 getLoader() 方法入手。數組

getLoader()

文件位於: __DIR__ . '/composer' . '/autoload_real.php';app

邏輯順序:composer

1、若是靜態變量 $loader 不爲空則返回 $loader函數

2、註冊一個自動加載程序,加載程序爲本類的 loadClassLoader() 方法,ui

[loadClassLoader 方法邏輯]this


靜態方法,含有一個 $class 參數,判斷若是 $class 等於 Composer\Autoload\ClassLoader,則載入當前目錄下
的 ClassLoader.php 文件,其實是在爲這句代碼工做:self::$loader = $loader = new \Composer\Autoload\ClassLoader();spa


3、 $loader 獲得 ClassLoader 類(\Composer\Autoload\ClassLoader)的一個實例,卸載自動加載程序 loadClassLoader,

4、載入路徑信息,設置路徑信息,

5、載入一些 autoload_x.php 形式的文件,


分別有:

  • autoload_namespaces.php
  • autoload_psr4.php
  • autoload_classmap.php

並進行各自的循環 set 操做,如 $loader->set($namespace, $path);

【set 函數】2 個參數,一個前綴,一個路徑。若是前綴非真,將 paths 轉爲數組類型賦值給類成員變量 fallbackDirsPsr0,若是前綴爲真,則將路徑賦值給
$this->prefixesPsr0[$prefix[0]][$prefix] ,這個寫法的意思等同於字母索引,好比 phpDocumentor ,則數組就圖所示:

 


6、執行一個 $loader->register(true);

[register 方法邏輯]


一個布爾值參數,將傳給 spl_autoload_register 第三個參數中。
而自動加載程序爲:array($this, 'loadClass'),也就是本類的 loadClass() 方法。

[loadClass 方法邏輯]

一個 $class 參數,用了 findFile() 方法判斷文件是否存在,存在則調用函數 includeFile() 載入文件。

 

注意:這個函數也在本類中直接定義了的。


7、還載入了一個 autoload_files.php,而裏面也是一組文件數組,貌似預加載一些函數庫文件吧,沒有繼續深刻這裏了。

8、最後返回一個 $loader 變量,也就是 ClassLoader 類的實例。

好了,如今看看 $loader 這個實例到此擁有些什麼?部分截圖所示:

 

能夠看出類屬性包含了具備字母索引的一些命名空間,文件路徑等信息。這和剛纔載入那幾個文件進行 set 操做有關,想起來了嗎?

到此 getLoader() 方法邏輯結束。

總結

實現自動化的關鍵代碼是 vendor/autoload.php 的 ::getLoader() 靜態方法,
利用此方法內部的 $loader->register(true); 方法註冊自動化載入方法,這樣,當 new 對象的時候自動觸發 loadClass() 了,而上面提到的 set 一些路徑信息,正是自動化的必備條件,若有興趣能夠自行查看 vendor/composer/ClassLoader.php 的 loadClass() 方法代碼細節。

上面若是沒懂的,請打開文件代碼,跟着慢慢走,慢慢看,必定能懂。

在返回到 vendor/autoload.php,在把 return $loader 返回到上一層。
即 bootstrap/autoload.php,
這行的代碼 require __DIR__.'/../vendor/autoload.php';
咱們 var_dump() 下 require 的返回值,和剛纔 $loader 的部分截圖徹底一致。
其實有從 aotuload_real.php 文件開始,我嘗試過刪除 return,也沒有任何報錯,不知道這裏的 return 意義爲什麼。

但是尚未看到真正 new, 咱們知道了原理,得看看它在哪調用了?
在看 index.php 定位到了 bootstrap/app.php
打開就看到第一個

$app = new Illuminate\Foundation\Application(     realpath(__DIR__.'/../') );
相關文章
相關標籤/搜索