早期使用 __autoload() 魔術方法,但只能定義一次,無法多庫共存。PHP 5.1.2 引入 spl_autoload_register(),支持註冊多個加載器、優先級控制、異常捕獲,現為標準做法。PHP 7.2+ 棄用 __autoload,請遷移至 SPL 方式。
spl_autoload_register(null, false); // 清空現有
spl_autoload_extensions('.php, .class.php'); // 設置默認擴展
function classLoader($class) {
$file = 'classes/' . strtolower($class) . '.class.php';
if (file_exists($file)) include $file;
}
spl_autoload_register('classLoader');
$norman = new norman(); // 自動加載 classes/norman.class.php
function classLoader($class) { /* 加載 classes/ 下 .class.php */ }
function libLoader($class) { /* 加載 libs/ 下 .lib.php */ }
spl_autoload_register('classLoader');
spl_autoload_register('libLoader'); // classLoader 失敗時嘗試 libLoader
同樣觸發自動加載,確保實現類加載前接口已定義。
spl_autoload_register('autoload');
function autoload($class, $dir = null) {
is_null($dir) && $dir = '/path/to/project';
foreach (scandir($dir) as $file) {
$path = $dir . $file;
if (is_dir($path) && $file[0] !== '.') {
autoload($class, $path . '/'); // 遞歸子目錄
} elseif (preg_match('/\.php$/i', $file) && $file[0] !== '.' && $file[1] !== '_') {
$name = basename($file, '.php');
$name = basename($name, '.class.php');
if ($name === $class) include $path;
}
}
}
核心特性:
token_get_all() 解析文件提取類/接口/函數名,而非靠文件名推斷。關鍵方法:
class LtAutoloader {
public $autoloadPath = []; // 掃描目錄
public $devMode = true; // 開發/生產模式
public $allowFileExtension = ['php','inc'];
public $skipDirNames = ['.svn','.git'];
public function init() { /* 掃描構建映射、註冊 loadClass */ }
protected function loadClass($className) { /* 映射查找 include */ }
protected function scanDirs($dirs) { /* 遞歸掃描、解析 token、構建映射 */ }
protected function parseLibNames($src) { /* token_get_all 解析類/接口/函數 */ }
// ... 緩存、去重、錯誤處理邏輯
}
set_include_path(implode(PATH_SEPARATOR, [
get_include_path(),
__DIR__ . '/services',
__DIR__ . '/printers'
]));
spl_autoload_register(); // 使用內置 spl_autoload(按 include_path 查找 $class.php)
要求文件名與類名完全一致(含大小寫),目錄結構扁平。
PSR-4 定義:命名空間前綴 → 基礎目錄 映射,類名尾部對應文件名,命名空間分隔符 \ 對應目錄分隔符。
// 示例映射 'App\\' => __DIR__ . '/src' 'Vendor\\Package\\' => __DIR__ . '/vendor/package/src' // 類 App\Controller\UserController → src/Controller/UserController.php // 類 Vendor\Package\Service\MailService → vendor/package/src/Service/MailService.php
Composer 自動生成符合 PSR-4 的 vendor/autoload.php,現代框架(Laravel、Symfony、ThinkPHP 5+)均遵循此標準。
composer dump-autoload -o)。