早期 PHP 專案需手動 require_once 大量類別檔案,極易出錯且難以維護。自動載入機制讓 PHP 在需要類別時「即時、自動」載入對應檔案,是現代框架的基石。
new ClassName() 實例化物件ClassName::$property、ClassName::method()function __autoload($className) {
require "./lib/{$className}.class.php";
}
缺點:全域只能定義一個,無法應對多目錄、多命名規則。
可註冊多個載入函式,依序嘗試直到成功:
spl_autoload_register('loadModel');
spl_autoload_register('loadController');
function loadModel($class) {
$file = "./model/{$class}.class.php";
if (file_exists($file)) require $file;
}
function loadController($class) {
$file = "./controller/{$class}.class.php";
if (file_exists($file)) require $file;
}
class Loader {
public function loadModel($class) { /* ... */ }
public static function loadCore($class) { /* ... */ }
}
$loader = new Loader();
spl_autoload_register([$loader, 'loadModel']); // 非靜態方法
spl_autoload_register([Loader::class, 'loadCore']); // 靜態方法
專案級解決方案:定義「命名空間前綴 → 目錄路徑」對應,由 Composer 產生高效載入器。
// composer.json 設定範例
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Core\\": "core/src/"
}
}
}
執行 composer dump-autoload 產生 vendor/autoload.php,專案僅需 require 'vendor/autoload.php' 即可享受標準化自動載入。
spl_autoload_register('frameworkAutoload');
function frameworkAutoload($class) {
// 核心類別精確映射
$coreMap = [
'Database' => __DIR__ . '/core/Database.php',
'Config' => __DIR__ . '/core/Config.php',
'Request' => __DIR__ . '/core/Request.php',
];
if (isset($coreMap[$class])) {
require $coreMap[$class];
return;
}
// 慣例式載入:Controller、Model 後綴
$basePath = __DIR__ . '/app';
if (str_ends_with($class, 'Controller')) {
$file = "{$basePath}/controllers/{$class}.php";
} elseif (str_ends_with($class, 'Model')) {
$file = "{$basePath}/models/{$class}.php";
} else {
return; // 不處理,交給下一個載入器
}
if (file_exists($file)) require $file;
}
類別名.php(大小寫敏感),與命名空間層級對應目錄結構composer dump-autoload -o 產生類別映射陣列,避免檔案系統搜尋