我們探索了 從
1 app/public/index.php 開始
2 加載 bootstrap /autoload.php 文件
3 然后加載到 vendor / autoload.php文件
4 然后終于找到了 /vendor/composer/autoload_real.php 文件
終于開始了 真正的自動加載,在這里 他封裝了一個類担汤。
而且這個類纷跛,也是十分 奇特,是 一個 ComposerAutoLoaderInit[salt] 一個非常特殊的類列赎!
跟自動生成是類似的表鳍。
通過靜態(tài)函數(shù) getLoader 函數(shù)团甲,執(zhí)行 內(nèi)部的 方法逾冬。
我們首先看一下這個神器的文件,里面包含兩個部分的內(nèi)容:
1 ComposerAutoLoaderInit[salt] 類
2 composerRequire[salt] 函數(shù)
在類內(nèi)部:包含 1個 私有的變量函數(shù) 就是 loader 函數(shù)
包含兩個內(nèi)部的函數(shù):
1loaderClassLoader(class):void 函數(shù)
2getLoader():Composer\Autoload\Composer
下面細(xì)分一下 getLoader()函數(shù)內(nèi)部的情況,
首先進(jìn)行了單列變量的一個判讀 也就是說 $loader 變量 里面是否存有相關(guān)數(shù)據(jù)
if(null!==self::$loader){
return
self::$loader;
}
如果存有的話身腻,直接返回产还,停止向后執(zhí)行。
否則嘀趟!
正式開始 自動加載的流程:
第一步:注冊系統(tǒng)自動加載函數(shù)
spl_autoload_register(array('ComposerAutoloaderInitf0edef8d82d469d4cfba4316d7feb75f','loadClassLoader'),true,true);
知識點擴展:
spl_autoload_register
這個函數(shù):
boolspl_autoload_register([callable$autoload_function[,bool$throw=true[,bool$prepend=false]]] )
spl_autoload_register可以很好地處理需要多個加載器的情況脐区,這種情況下spl_autoload_register會按順序依次調(diào)用之前注冊過的加載器。作為對比她按,__autoload因為是一個函數(shù)牛隅,所以只能被定義一次。
autoload_function
欲注冊的自動裝載函數(shù)酌泰。如果沒有提供任何參數(shù)媒佣,則自動注冊 autoload的默認(rèn)實現(xiàn)函數(shù)spl_autoload()。
throw
此參數(shù)設(shè)置了autoload_function無法成功注冊時陵刹,spl_autoload_register()是否拋出異常默伍。
prepend
如果是true,spl_autoload_register()會添加函數(shù)到隊列之首衰琐,而不是隊列尾部也糊。
上述用法解析為:自動加載 類的 loadClassLoader 函數(shù),如果添加異常羡宙,則拋出異常狸剃, 后面的true 代表
添加的 序列 之首。
然后回到正途:
第二步:實例化 這個 ClassLoader 類
self::$loader=$loader=new\Composer\Autoload\ClassLoader();
并且賦值給 當(dāng)前的單例句柄狗热。
第三步:刪除已經(jīng)注冊的自動加載函數(shù)
spl_autoload_unregister—注銷已注冊的__autoload()函數(shù)
綜合上述三步:就是為了 能夠 讓 self::$laoder = $loader 能夠被實例化钞馁!
如果,僅僅是為了實現(xiàn)這個斗搞,我覺得指攒,還不如慷妙,直接
就自動加載函數(shù)文件僻焚。
接下來手下加載命名空間:
1$map=require__DIR__.'/autoload_namespaces.php';
2
foreach($mapas$namespace=>$path){
$loader->set($namespace,$path);
}
同 ClassLoader.php 里面的 set函數(shù) 把 文件存入變量 倉庫
$this->prefixesPsr0[$prefix[0]][$prefix] =
(array)$paths;
注意:這里的0是我們的
第一個字母。
第二步:注冊psr4標(biāo)準(zhǔn)的文件 的命名 空間 對應(yīng)的路徑
$map=require__DIR__.'/autoload_psr4.php';
foreach($mapas$namespace=>$path){
$loader->setPsr4($namespace,$path);
}
$this->prefixDirsPsr4[$prefix] =
(array)$paths;
第三:
$classMap=require__DIR__.'/autoload_classmap.php';
if($classMap){
$loader->addClassMap($classMap);
}
$this->classMap=array_merge($this->classMap,$classMap);
注冊真正的 spl_autoload_register 方法為 ClassLoader->loaderClass
方法膝擂,
加載全部的自動加載的文件
$includeFiles=require__DIR__.'/autoload_files.php';
foreach($includeFilesas$fileIdentifier=>$file){
composerRequiref0edef8d82d469d4cfba4316d7feb75f($fileIdentifier,$file);
}
返回 實例化的 后的處理類對象虑啤。
處理完成
總結(jié):
1 就是按照 各種標(biāo)準(zhǔn) 加載 命名空間對應(yīng)的路徑
2 按照psr4標(biāo)準(zhǔn) 加載命名空間對應(yīng)的路徑
3 加載 系統(tǒng)需要加載的類文件
4 注冊自動加載函數(shù)
5加載 幫助函數(shù)
php初學(xué)者-千鋒php課程筆記