安裝套件後,只需引入 vendor/autoload.php 即可直接使用類別:
require '/path/to/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('name');
$log->pushHandler(new StreamHandler('/path/to/log.log', Logger::WARNING));
$log->addWarning('Foo');
$log->addError('Bar');
Composer 支援四種方式,於 composer.json 的 autoload 區塊設定:
命名空間對應目錄,結構扁平:
{
"autoload": {
"psr-4": {
"Foo\\": "src/"
}
}
}
載入 Foo\Bar\Baz 會尋找 src/Bar/Baz.php。注意命名空間結尾需雙反斜線並轉義。
{
"autoload": {
"psr-0": {
"Foo\\": "src/"
}
}
}
載入同樣類別會尋找 src/Foo/Bar/Baz.php(含命名空間層級)。
{
"autoload": {
"classmap": ["src/", "lib/", "Something.php"]
}
}
掃描指定目錄下 .php/.inc 檔案中的類別,建立 類別 => 檔案路徑 對照表。適合不遵循 PSR 規範的舊專案。
{
"autoload": {
"files": ["src/MyLibrary/functions.php"]
}
}
直接包含指定檔案,常用於全域 helper 函數。
Composer 產生的 autoload_real.php 初始化 ClassLoader,依序註冊四種策略:
// 註冊 PSR-4
$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
$loader->setPsr4($namespace, $path);
}
// 註冊 PSR-0
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}
// 註冊 Classmap
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) $loader->addClassMap($classMap);
// 直接包含 Files
$includeFiles = require __DIR__ . '/autoload_files.php';
foreach ($includeFiles as $file) {
composerRequire($file);
}
findFile() 依序嘗試:
找不到則寫入 classmap 為 false 避免重複查找。