Composer提供了四種方式的支持,分別是 PSR-0和PSR-4的自動加載(我的一篇文章也有介紹過它們),生成class-map,和直接包含files的方式。
PSR-4是composer推薦使用的一種方式,因為它更易使用並能帶來更簡潔的目錄結構。在composer.json里是這樣進行配置的:
{
"autoload": {
"psr-4": {
"Foo\\": "src/",
}
}
}
key和value就定義出了namespace以及到相應path的映射。按照PSR-4的規則,當試圖自動加載 "Foo\\Bar\\Baz" 這個class時,會去尋找 "src/Bar/Baz.php" 這個文件,如果它存在則進行加載。注意, "Foo\\"
並沒有出現在文件路徑中,這是與PSR-0不同的一點,如果PSR-0有此配置,那么會去尋找
"src/Foo/Bar/Baz.php"
這個文件。
另外注意PSR-4和PSR-0的配置里,"Foo\\"結尾的命名空間分隔符必須加上並且進行轉義,以防出現"Foo"匹配到了"FooBar"這樣的意外發生。
在composer安裝或更新完之后,psr-4的配置換被轉換成namespace為key,dir path為value的Map的形式,並寫入生成的 vendor/composer/autoload_psr4.php 文件之中。
{
"autoload": {
"psr-0": {
"Foo\\": "src/",
}
}
}
最終這個配置也以Map的形式寫入生成的
vendor/composer/autoload_namespaces.php
文件之中。
Class-map方式,則是通過配置指定的目錄或文件,然后在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
文件中,以供autoloader直接進行加載。
