__DIR__ . '/composer' . '/autoload_real.php';
定位完畢,你會看到這樣的代碼:php
return ComposerAutoloaderInit2bf9ae5262a23b284c9433508d41d77f::getLoader();
web
ComposerAutoloaderInit2bf9ae5262a23b284c9433508d41d77f 簡稱本類。bootstrap
那咱們就從 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 形式的文件,
分別有:
並進行各自的循環 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__.'/../') );