關(guān)于介紹Composer的一篇不錯的博文
Composer作為管理包依賴的工具,本身也提供了對于類加載的支持。上面的博文有了對于composer類加載的四種方式的介紹。
今天簡單看了一下其加載方式的實現(xiàn)。簡單介紹之前,希望大家自己先使用composer構(gòu)建一次項目依賴。
使用Composer完成PRoject依賴管理(Mac)
進入項目目錄下執(zhí)行composer init
,之后根據(jù)提示輸入一系列東西,當然如果你很懶惰,那就一路enter吧。看一看你的composer.json
文件吧,所有的配置我們都會寫在里面。javaScript{ "name": "Jian/composer", "description": "Jian test composer", "type": "project", "authors": [ { "name": "Jian", "email": "[email protected]" } ], "require": { "laravel/framework": "5.2.*" }, "repositories": { "packagist": { "type": "composer", "url": "https://packagist.phpcomposer.com" } }}這里我們就簡單從配置中的倉庫拉取laravel的庫,指定版本5.2.*
vendor目錄下就是由composer生成的內(nèi)容,同時如果在composer.json中配置了psr-0 psr-4 classmap files這些類加載方式的話,會生成一個composer目錄.
看看具體干了什么
如同上面給到的鏈接里寫到的一樣,核心處理類就是
vendor/composer/autoload_real.php
這個類,它做的事情就是把psr-0,psr-4,classmap以及files四種方式加載的類注冊到vendor/composer/ClassLoader
類下。classMap->ClassLoader的classmap數(shù)組中psr-0 psr-4->namespace注冊到相應(yīng)數(shù)組files中定義的文件全部放在全局變量$GLOBALS['_composerautoload_files']中上面的類注冊后,會執(zhí)行vendor/composer/ClassLoader類的register方法,將該類下的loadClass方法注冊到類加載隊列中,之后當new一個新的類的時候,php會在所有注冊的類加載函數(shù)中進行查找(執(zhí)行注冊進來的方法)。
LoadClass方法
執(zhí)行findFile方法
如果ClassLoader下的classmap數(shù)組中有相應(yīng)的類,直接返回;如果在missingFiles中有紀錄這個類是加載不到的,直接返回false。如果apcu前綴不為空且在php.ini配置中開啟了apc功能,則使用apcu_fetch查詢類是否存在根據(jù)文件名,帶上文件后綴.php
在psr0和psr4中進行查找。如果在第三步之中找到相應(yīng)class,則在第二步的前提條件下,將類路徑借助apcu_add存起來。如果以上都找不到相應(yīng)的類,則將類紀錄在missFiles數(shù)組中。
新聞熱點
疑難解答