升級 Smarty 到 3.0 後,原本專案的 __autoload() 失效,拋出錯誤。查閱 Smarty 3 的 SMARTY2_BC_NOTES 發現:Smarty 3 內建使用 spl_autoload_register() 註冊自己的自動載入器,若專案仍使用傳統 __autoload(),必須手動將其註冊到 SPL 自動載入堆疊中,否則會被覆蓋。
將原本散落在全域的 __autoload() 邏輯封裝為類別方法,再以 spl_autoload_register() 註冊。
<?php
function __autoload($className) {
if(substr($className, -6)=="Action"){
include(APP_CLASS_PATH.'Action/'.$className.".class.php");
}elseif(substr($className, -5)=="Model"){
include(APP_CLASS_PATH.'Model/'.$className.".class.php");
}elseif($className=="Smarty"){
require_once NET_ROOT."Smarty/Smarty.class.php";
}elseif(substr($className, -6)=="Public"){
include(APP_CLASS_PATH.'Public/'.$className.".class.php");
}
}
<?php
class ClassAutoloader {
public function __construct() {
spl_autoload_register(array($this, 'loader'));
}
private function loader($className) {
if(substr($className, -6)=="Action"){
include(APP_CLASS_PATH.'Action/'.$className.".class.php");
}elseif(substr($className, -5)=="Model"){
include(APP_CLASS_PATH.'Model/'.$className.".class.php");
}elseif($className=="Smarty"){
require_once NET_ROOT."Smarty/Smarty.class.php";
}elseif(substr($className, -6)=="Public"){
include(APP_CLASS_PATH.'Public/'.$className.".class.php");
}
}
}
// 初始化自動載入器
$autoloader = new ClassAutoloader();
spl_autoload_register() 可註冊多個自動載入函式,依序嘗試載入,避免衝突。<?php
spl_autoload_register(function ($class) {
$prefix = 'App\\';
$base_dir = __DIR__ . '/src/';
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) return;
$relative_class = substr($class, $len);
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
if (file_exists($file)) require $file;
});
若專案已採用 PSR-4 規範,建議直接使用 Composer 自動產生的 vendor/autoload.php,無需自行實作。