Composer是PHP中用來管理依賴(dependency)關係的工具。你能夠在本身的項目中聲明所依賴的外部工具庫(libraries),Composer會幫你安裝這些依賴的庫文件。 php
自動加載是指在代碼中,不須要顯式地使用文件路徑將類庫文件包含進來,即可使用該文件中定義的類庫。git
PHP的自動加載可使用__autoload()和spl_autoload_register()兩種機制,但後一種爲主流,緣由是:github
__autoload()是全局惟一的,若是框架佔了這個名字,便會致使框架的用戶用不了其它的__autoload()了,包括用戶自定義的和其它類庫帶的。spl_autoload_register()能夠註冊多個autoload方法,不存在這個問題。json
__autoload()是一個函數,在實際使用中,開發者勢必要賦予它一些變量(例如class path和class_name => file_path mapping數組)。這就只能靠全局變量了,使用全局變量可不是好的編碼習慣。spl_autoload_register()能夠將一個Class的某個方法註冊爲autoload函數,如Symfony的spl_autoload_register(array(self::getInstance(), 'autoload'));數組
Composer提供了四種自動加載的方式,分別是PSR-0、PSR-四、生成classmap以及直接包含files。app
提到psr-0和psr-4就不得不先了解命名空間,命名空間的詳細介紹詳見底部《PHP手冊:命名空間》[[1]](#php-namespace)。composer
psr-0方式,要求目錄名稱和命名空間層層對應,會致使目錄結構容易變得比較深。雖然已被官方廢棄,但由於主流框架都已實現psr-0,所以composer仍然使用psr-0來向下兼容。框架
"autoload": { "psr-0": { "Foo\\": "src/", } }
按照PSR-0的規則,當試圖自動加載 "Foo\Bar\Baz" 這個class時,那麼會去尋找"src/Foo/Bar/Baz.php",最終這個配置也以Map的形式寫入生成的vendor/composer/autoload_namespaces.php函數
psr-4方式,是composer推薦使用的一種方式,也是psr-0的替代方案,由於它更易使用並能帶來更簡潔的目錄結構。在composer.json裏是這樣進行配置的工具
"autoload": { "psr-4": { "Foo\\": "src/", } }
按照PSR-4的規則,當試圖自動加載 "Foo\Bar\Baz" 這個class時,會去尋找 "src/Bar/Baz.php" 這個文件。psr-4的配置換會被轉換成namespace爲key,dir path爲value的Map的形式,並寫入生成的 vendor/composer/autoload_psr4.php 文件之中
另外注意PSR-4和PSR-0的配置裏,"Foo\"結尾的命名空間分隔符必須加上而且進行轉義,以防出現"Foo"匹配到了"FooBar"這樣的意外發生。
classmap方式,則是經過配置指定的目錄或文件,而後在Composer安裝或更新時,它會掃描指定目錄下以.php或.inc結尾的文件中的class,生成class到指定file path的映射,並加入新生成的 vendor/composer/autoload_classmap.php 文件中。
"autoload": { "classmap": ["src/", "lib/", "Something.php"] }
例如src/下有一個BaseController類,那麼在autoload_classmap.php文件中,就會生成這樣的配置:
'BaseController' => $baseDir . '/src/BaseController.php'
files方式,就是手動指定供直接加載的文件。好比說咱們有一系列全局的helper functions,能夠放到一個helper文件裏而後直接進行加載
"autoload": { "files": ["src/MyLibrary/functions.php"] }
它會生成一個array,包含這些配置中指定的files,再寫入新生成的
vendor/composer/autoload_files.php
在composer.json配置完成以後,來到terminal執行 composer install
執行成功以後,composer就會幫你將加載機制建立完備,會獲得一個vendor文件夾。
最後,只要在項目中require 'vendor/autoload.php';
你所須要的全部類庫都會在適當的時候自動載入。
《PHP手冊:命名空間》http://php.net/language.names...
《PHP手冊:自動加載類》http://php.net/manual/zh/lang...
《細說「PHP類庫自動加載」》https://github.com/qinjx/adv_...
《composer設計原理及用法》http://blog.turn.tw/?p=1039
《composer進階原理:PHP命名空間與PSR-0》http://blog.turn.tw/?p=1122
《PHP管理依賴關係工具Composer的自動加載》http://www.jb51.net/article/5...