最近在看TP的源碼,簡單實現了TP的MVC功能。
其中就涉及TP的代碼加載機制,這裏做一個簡單的介紹,方便理解記錄。
PHP自身就有autoload方法可以自動加載,TP藉助這個方法重寫了類的加載。
具體代碼如下:
// 註冊系統自動加載
spl_autoload_register($autoload ?: 'sunny\\Loader::autoload', true, true);
// 註冊命名空間定義
self::addNamespace([
'sunny' => SUNNY_PATH . DS,
'app' => APP_PATH,
]);
第一行就是註冊了系統的自動加載,使用自己寫的autoload方法。
第二行是本地的使用PSR-4命名規則的命名空間的類加載
// 註冊命名空間
public static function addNamespace($namespace, $path = '')
{
if (is_array($namespace)) {
foreach ($namespace as $prefix => $paths) {
self::addPsr4($prefix . '\\', rtrim($paths, DS), true);
}
} else {
self::addPsr4($namespace . '\\', rtrim($path, DS), true);
}
}
我的理解就是將命名空間的第一個名字和對應的路徑存在一個數組裏,然後在autoload的方法中查找本地文件是否存在,存在則引入。