__autoload() 魔術函數,嘗試載入未定義類別。spl_autoload_register(),支援多載入器、優先序、例外處理,取代 __autoload。__autoload() 棄用。__autoload() 移除。function __autoload($className) {
$file = __DIR__ . "/classes/{$className}.php";
if (file_exists($file)) require_once $file;
}
缺點:全域僅能有一個、無法解除註冊、例外處理困難、命名空間對應需自行處理。
<?php
// 1. 靜態方法載入器
class Loader {
public static function loadClass($className) {
$file = __DIR__ . "/src/" . str_replace('\\', '/', $className) . '.php';
if (file_exists($file)) {
require_once $file;
return true;
}
return false;
}
}
spl_autoload_register(['Loader', 'loadClass']);
// 2. 閉包載入器(匿名函數)
spl_autoload_register(function($className) {
$file = __DIR__ . "/lib/" . str_replace('\\', '/', $className) . '.php';
if (file_exists($file)) require_once $file;
});
// 3. 多載入器優先序(後註冊優先執行)
spl_autoload_register('autoload_v1');
spl_autoload_register('autoload_v2'); // 先嘗試 v2
// 4. 解除註冊
spl_autoload_unregister('autoload_v1');
現代專案**不手寫載入器**,改用 Composer 產生 vendor/autoload.php,遵循 PSR-4:
// composer.json
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Vendor\\Package\\": "packages/package/src/"
}
}
}
對應關係:App\Controller\UserController → src/Controller/UserController.php。
composer.json 所有 autoload 區塊。vendor/composer/autoload_psr4.php、autoload_classmap.php)。ComposerAutoloader::loadClass 至 spl_autoload_register。false 讓下一個載入器嘗試。composer dump-autoload -o 產生完整 ClassMap,載入速度最快。require,初始化邏輯放在類別建構子或服務提供者。spl_autoload_functions() 查看已註冊載入器;xdebug 斷點在載入器觀察解析路徑。