早期 PHP 專案需手動 require_once 每個類文件,隨項目增大極易遺漏或包含多餘文件。PHP 5 引入 autoload 機制(延遲加載),僅在類被實際使用時才載入文件,大幅簡化依賴管理。
function __autoload($className) {
require_once $className . '.class.php';
}
$person = new Person('Altair', 6); // 自動觸發 __autoload('Person')
核心任務:類名 → 文件路徑映射 → 載入。但單一 __autoload 無法應對多套命名規則(如第三方庫)。
FETCH_CLASS 指令尋找類。zend_lookup_class_ex。autoload_func 指針:__autoload() 並執行。spl_autoload_call),不再調用 __autoload。SPL (Standard PHP Library) 提供兩大函數:
include_path 搜尋 類名.inc 或 類名.php(類名轉小寫)。autoload_functions(HashTable),依序執行每個加載器,直到類被找到。// 將自定義加載函數加入隊列,並將 autoload_func 指向 spl_autoload_call
spl_autoload_register('myCustomLoader');
// 也可註冊類靜態方法或閉包
spl_autoload_register(['MyLoader', 'load']);
spl_autoload_register(function($class) { /* ... */ });
// 移除已註冊加載器
spl_autoload_unregister('oldLoader');
若仍需保留 __autoload,只需將其也註冊進隊列:
spl_autoload_register('__autoload');
autoload 本身不慢,慢的是設計不良的映射規則。
每次 file_exists、is_file 都會觸發磁盤 I/O。優化關鍵:
include_path 目錄中盲目搜尋。vendor/autoload.php)。__autoload,改用 spl_autoload_register 註冊多個專用加載器。composer dump-autoload -o 生成優化 ClassMap。