[TOC]
* * * * *
## 1 加載器接口
### 加載器初始化
>[info] 注冊加載器函數
`public static function register($autoload = '')`
> $autoload: 加載器函數 默認為Loader::autoload()
* * * * *
### 注冊命名空間/類名別名
>[info] 注冊命名空間別名
`public static function addNamespace($namespace, $path = '')`
> $namespace:待注冊命名空間
> $path:待注冊命名空間對應目錄
* * * * *
>[info] 注冊類名別名
`public static function addMap($class, $map = '')`
> $class:待注冊類名
> $map:待注冊類名對應別名
* * * * *
### 加載文件
>[info] 類Java加載函數
`public static function import($class, $baseUrl = '', $ext = EXT) `
> $class:加載的類名
> $baseUrl:加載的類文件目錄
> $ext:加載的文件后綴
* * * * *
>[info] 類自動加載
`public static function autoload($class) `
> $class:加載的類名
## 2 加載器原理
### 加載器初始化 Loader::rigister()
`spl_autoload_register($autoload ? $autoload : 'think\\Loader::autoload');`
注冊系統自動加載$autolaod
`self::registerComposerLoader();`
注冊composer自動加載
* * * * *
>[info] composer自動加載注冊 Loader::registerComposerLoader()
composer自動加載原理見 [php的自動加載](http://www.hmoore.net/zmwtp/tp5/119447#4-composer-)
`if (is_file(VENDOR_PATH . 'composer/autoload_namespaces.php')) {}`
composer/autoload_namespaces.php注冊到self::$prefixesPsr0
`if (is_file(VENDOR_PATH . 'composer/autoload_psr4.php')) {}`
composer/autoload_psr4.php注冊到self::$prefixDirsPsr4[$namespace]
`if (is_file(VENDOR_PATH . 'composer/autoload_classmap.php')) {}`
composer/autoload_classmap.php注冊到self::$map
`if (is_file(VENDOR_PATH . 'composer/autoload_files.php')) {}`
composer/autoload_files.php中文件依次加載
### 命名空間與目錄關系注冊 Loader::addNamespace()
`self::$namespace = array_merge(self::$namespace, $namespace);`
$namespae為 array('namespace1'=>'path1','namespace2'=>'path2'),
$path為空時,將$namespace合并到self::$namespace。
`self::$namespace[$namespace] = $path;`
兩個參數則注冊$namespace與$path到self::$namespace
### 類名與文件關系注冊 Loader::addMap()
`self::$map = array_merge(self::$map, $class);`
$class為array('class1'=>'map1','class2'=>'map2')
$map為空時,將$class合并到self::$map。
`self::$map[$class] = $map;`
兩個參數注冊$class與$map關聯到self::$map
### 文件自動加載 Loader::autoload()
`if (isset(self::$map[$class])) {}`
首先檢查類別名對應的類文件,
如果存在,則加載對應類文件
`elseif ($file = self::findFileInComposer($class)) {}`
次之使用Composer加載對應類文件
`else {}`
最后解析類名中的命名空間,類到對應文件,并加載
### 文件手動加載 Loader::import()
`static $_file = [];`
手動加載文件的全局緩存數組
$class參數解析:
`$class = str_replace(['.', '#'], [DS, '.'], $class);`
將$class參數中的符號"." "#"解析為目錄分隔符,
~~~
if (isset($_file[$class . $baseUrl])) {
return true;
} else {
$_file[$class . $baseUrl] = true;
}
~~~
檢查$_file全局緩存數組是否已加載。
$baseUrl參數解析:
`if (empty($baseUrl)) {}else{}`
檢查是否添加$baseUrl參數。
`list($name, $class) = explode(DS, $class, 2);`
將$class以目錄分割符分解為到目錄名$name,文件名$class變量中
~~~
if (isset(self::$namespace[$name])) {
$baseUrl = self::$namespace[$name];
}
~~~
$name對應的目錄已注冊到$namespace,獲取對應目錄。
~~~
elseif ('@' == $name || MODULE_NAME == $name) {
$baseUrl = MODULE_PATH;
}
~~~
$name為@或者MODULE_NAME,獲取對應模塊目錄。
`elseif (in_array($name, ['traits', 'think', 'behavior']))`
$name為traits,think,behavior等根命名空間,獲取對應目錄
`elseif (APP_NAMESPACE == $name) `
$name為應用命名空間,獲取應用目錄
`elseif (is_dir(EXTEND_PATH . $name))`
$name為框架擴展目錄,獲取擴展目錄
~~~
else {
$baseUrl = APP_PATH . $name . DS;
}
~~~
$name為應用的$name的目錄
~~~
elseif (substr($baseUrl, -1) != DS) {
$baseUrl .= DS;
}
~~~
$baseUrl參數存在,則解析為$baserUlr目錄
`$filename = $baseUrl . $class . $ext;`
根據$baseUrl,$class,$ext合成目標文件名
~~~
if (is_file($filename)) {
if (APP_DEBUG && IS_WIN && false === strpos(realpath($filename), $class . $ext)) {
return false;
}
include $filename;
return true;
}
~~~
對應目標文件存在,加載對應目標文件。
## 3 加載器框架示例
~~~
thinkphp\start.php
Loader::register();
if (isset($mode['namespace'])) {
Loader::addNamespace($mode['namespace']);
}
if (isset($mode['alias'])) {
Loader::addMap(is_array($mode['alias']) ? $mode['alias'] : include $mode['alias']);
}
~~~
~~~
thinkphp\library\think\App::run()
if (!empty($config['root_namespace'])) {
Loader::addNamespace($config['root_namespace']);
}
~~~
~~~
thinkphp\library\think\App::initModule()
if (is_file($path . 'alias' . EXT)) {
Loader::addMap(include $path . 'alias' . EXT);
}
~~~
- 更新記錄
- 概述
- 文件索引
- 函數索引
- 章節格式
- 框架流程
- 前:章節說明
- 主:(index.php)入口
- 主:(start.php)框架引導
- 主:(App.php)應用啟動
- 主:(App.php)應用調度
- C:(Controller.php)應用控制器
- M:(Model.php)數據模型
- V:(View.php)視圖對象
- 附:(App.php)應用啟動
- 附:(base.php)全局變量
- 附:(common.php)模式配置
- 附:(convention.php)全局配置
- 附:(Loader.php)自動加載器
- 附:(Build.php)自動生成
- 附:(Hook.php)監聽回調
- 附:(Route.php)全局路由
- 附:(Response.php)數據輸出
- 附:(Log.php)日志記錄
- 附:(Exception.php)異常處理
- 框架工具
- 另:(helper.php)輔助函數
- 另:(Cache.php)數據緩存
- 另:(Cookie.php)cookie操作
- 另:(Console.php)控制臺
- 另:(Debug.php)開發調試
- 另:(Error.php)錯誤處理
- 另:(Url.php)Url操作文件
- 另:(Loader.php)加載器實例化
- 另:(Input.php)數據輸入
- 另:(Lang.php)語言包管理
- 另:(ORM.php)ORM基類
- 另:(Process.php)進程管理
- 另:(Session.php)session操作
- 另:(Template.php)模板解析
- 框架驅動
- D:(\config)配置解析
- D:(\controller)控制器擴展
- D:(\model)模型擴展
- D:(\db)數據庫驅動
- D:(\view)模板解析
- D:(\template)模板標簽庫
- D:(\session)session驅動
- D:(\cache)緩存驅動
- D:(\console)控制臺
- D:(\process)進程擴展
- T:(\traits)Trait目錄
- D:(\exception)異常實現
- D:(\log)日志驅動
- 使用范例
- 服務器與框架的安裝
- 控制器操作
- 數據模型操作
- 視圖渲染控制
- MVC開發初探
- 模塊開發
- 入口文件定義全局變量
- 運行模式開發
- 框架配置
- 自動生成應用
- 事件與插件注冊
- 路由規則注冊
- 輸出控制
- 多種應用組織
- 綜合應用
- tp框架整合后臺auto架構快速開發
- 基礎原理
- php默認全局變量
- php的魔術方法
- php命名空間
- php的自動加載
- php的composer
- php的反射
- php的trait機制
- php設計模式
- php的系統時區
- php的異常錯誤
- php的輸出控制
- php的正則表達式
- php的閉包函數
- php的會話控制
- php的接口
- php的PDO
- php的字符串操作
- php的curl
- 框架心得
- 心:整體結構
- 心:配置詳解
- 心:加載器詳解
- 心:輸入輸出詳解
- 心:url路由詳解
- 心:模板詳解
- 心:模型詳解
- 心:日志詳解
- 心:緩存詳解
- 心:控制臺詳解
- 框架更新
- 4.20(驗證類,助手函數)
- 4.27(新模型Model功能)
- 5.4(新數據庫驅動)
- 7.28(自動加載)