Composer 不僅管理套件相依,更透過 vendor/autoload.php 提供強大的自動載入功能。本文詳細解析四種自動載入策略的配置方式、生成邏輯與核心原始碼流程。
<?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');
?>
目錄結構扁平,命名空間前綴對應基礎目錄:
{
"autoload": {
"psr-4": { "Foo\\": "src/" }
}
}
嘗試載入 Foo\Bar\Baz 時,會尋找 src/Bar/Baz.php。注意 Foo\\ 結尾必須有反斜線並轉義。
同樣配置下會尋找
src/Foo/Bar/Baz.php,命名空間前綴會出現在路徑中。3. ClassMap
掃描指定目錄/檔案中的類別,建立「類別名 → 檔案路徑」對照表:
適合不遵循 PSR 規範的舊專案或第三方程式庫。
4. Files
直接載入指定檔案(如全域 helper 函數):
Composer 核心自動載入器原始碼流程
vendor/composer/autoload_real.php初始化ClassLoader,依序註冊四種策略:$loader = new \Composer\Autoload\ClassLoader(); $loader->register(true); // PSR-4 $map = require 'autoload_psr4.php'; foreach ($map as $ns => $path) $loader->setPsr4($ns, $path); // PSR-0 $map = require 'autoload_namespaces.php'; foreach ($map as $ns => $path) $loader->set($ns, $path); // ClassMap $classMap = require 'autoload_classmap.php'; if ($classMap) $loader->addClassMap($classMap); // Files $includeFiles = require 'autoload_files.php'; foreach ($includeFiles as $file) composerRequire($file);
ClassLoader::findFile()查找順序:ClassMap → PSR-4 → PSR-4 fallback → PSR-0 → PSR-0 fallback → include_path。社群常見問題
spl_autoload_register 機制,依命名空間與目錄對應動態 include,避免手動撰寫大量 require。spl_autoload_register 或直接使用 Composer 自動載入器。