專案原有自定義 __autoload() 載入類別,引入 Smarty 後發現自動載入失效,類別找不到。原因是 Smarty 內部同樣註冊了自動載入器,覆蓋了舊的 __autoload。
__autoload() 函數。Smarty.class.php 中呼叫 spl_autoload_register() 註冊自身載入器,導致舊 __autoload 不再被呼叫。// 專案自動載入函數
function myAutoload($class) {
$file = ROOT_PATH . '/classes/' . $class . '.class.php';
if (is_file($file)) require_once $file;
}
// 關鍵:在 require Smarty 之後註冊
require_once ROOT_PATH . '/libs/Smarty.class.php';
spl_autoload_register('myAutoload'); // 將舊函數加入 SPL 隊列
// 或使用匿名函數 (PHP 5.3+)
spl_autoload_register(function($class) {
$file = ROOT_PATH . '/classes/' . $class . '.class.php';
if (is_file($file)) require_once $file;
});
// 1. 專案核心類別 (最高優先序)
spl_autoload_register('coreAutoload', true, true); // prepend = true 放隊列最前
// 2. 第三方庫 (Composer 自動處理)
require 'vendor/autoload.php';
// 3. Smarty 內部載入器 (require 時自動註冊)
// 4. 專案通用類別 (預設 append 到隊列尾)
spl_autoload_register('appAutoload');
spl_autoload_register(callable, throw, prepend):
throw:找不到類別是否拋出異常 (預設 true)。prepend:true 插隊列頭,false 追加隊列尾 (預設)。// composer.json
{
"autoload": {
"psr-4": {
"App\\": "src/",
"Core\\": "core/"
},
"classmap": ["legacy/"]
}
}
composer dump-autoload -o
入口文件僅需:
require __DIR__ . '/vendor/autoload.php'; // 所有符合 PSR-4 的類別自動可用,無需手寫 autoload
spl_autoload_register 在 require 'Smarty.class.php' 之後 呼叫。function __autoload(),請刪除並改為 spl_autoload_register。spl_autoload_functions() 列印隊列,確認順序符合預期。