傳統 include/require 需手動管理依賴,且會載入所有檔案影響效能。利用 ReflectionClass 觸發自動載入,配合 SPL spl_autoload_register 實現真正的按需加載與單例模式。
<?php
// test.php
class test {
public function showName() { var_dump(__CLASS__); }
}
// index.php
var_dump(get_included_files()); // 僅 index.php
$rf = new ReflectionClass('test'); // 觸發 __autoload 載入 test.php
var_dump(get_included_files()); // 多出 test.php
$testObj = $rf->newInstance();
$testObj->showName(); // string(4) "test"
// 定義自動載入器
function __autoload($classname) {
$classpath = './' . $classname . '.php';
if (file_exists($classpath)) require_once($classpath);
else echo "class file $classpath not found!";
}
?>
var_dump(spl_autoload_functions()); // array('__autoload')
spl_autoload_register('newAutoload'); // 註冊新載入器,取代 __autoload
var_dump(spl_autoload_functions()); // array('newAutoload')
function newAutoload($classname) {
$classpath = './' . $classname . '.php';
if (file_exists($classpath)) {
echo 'require success';
require_once($classpath);
} else {
echo "class file $classpath not found!";
}
}
// 封裝單例獲取實例
function getInstance($class, $returnInstance = false) {
$rf = new ReflectionClass($class);
if ($returnInstance) return $rf->newInstance();
}
// 測試:連續三次獲取同類實例,自動載入只執行一次
$o1 = getInstance('test', true);
$o2 = getInstance('test', true);
$o3 = getInstance('test', true); // 輸出僅一次 'require success'
getInstance 可靜態緩存實例,避免重複實例化。App\Controller\UserController → App/Controller/UserController.php)。Composer 自動產生的 vendor/autoload.php 已完美實現 PSR-4 自動載入,專案應直接使用,無需手寫。