[TOC]
* * * * *
## 1 自動加載器實例化源代碼(thinkphp/library/think/Loader)
~~~
public static function table($name = '', array $options = [])
{
static $_model = [];
if (strpos($name, ':')) {
list($class, $name) = explode(':', $name);
} else {
$class = 'think\\Model';
}
$guid = $name . '_' . $class;
if (!isset($_model[$guid])) {
$_model[$guid] = new $class($name, $options);
}
return $_model[$guid];
}
public static function model($name = '', $layer = MODEL_LAYER)
{
if (empty($name)) {
return new Model;
}
static $_model = [];
if (isset($_model[$name . $layer])) {
return $_model[$name . $layer];
}
if (strpos($name, '/')) {
list($module, $name) = explode('/', $name, 2);
} else {
$module = APP_MULTI_MODULE ? MODULE_NAME : '';
}
$class = self::parseClass($module, $layer, $name);
$name = basename($name);
if (class_exists($class)) {
$model = new $class($name);
} else {
$class = str_replace('\\' . $module . '\\', '\\' . COMMON_MODULE . '\\', $class);
if (class_exists($class)) {
$model = new $class($name);
} else {
Log::record('實例化不存在的類:' . $class, 'notice');
$model = new Model($name);
}
}
$_model[$name . $layer] = $model;
return $model;
}
public static function controller($name, $layer = '', $empty = '')
{
static $_instance = [];
$layer = $layer ?: CONTROLLER_LAYER;
if (isset($_instance[$name . $layer])) {
return $_instance[$name . $layer];
}
if (strpos($name, '/')) {
list($module, $name) = explode('/', $name);
} else {
$module = APP_MULTI_MODULE ? MODULE_NAME : '';
}
$class = self::parseClass($module, $layer, $name);
if (class_exists($class)) {
$action = new $class;
$_instance[$name . $layer] = $action;
return $action;
} elseif ($empty && class_exists($emptyClass = self::parseClass($module, $layer, $empty))) {
return new $emptyClass;
} else {
throw new Exception('class [ ' . $class . ' ] not exists', 10001);
}
}
public static function db($config = [])
{
return Db::connect($config);
}
public static function action($url, $vars = [], $layer = CONTROLLER_LAYER)
{
$info = pathinfo($url);
$action = $info['basename'];
$module = '.' != $info['dirname'] ? $info['dirname'] : CONTROLLER_NAME;
$class = self::controller($module, $layer);
if ($class) {
if (is_scalar($vars)) {
if (strpos($vars, '=')) {
parse_str($vars, $vars);
} else {
$vars = [$vars];
}
}
return App::invokeMethod([$class, $action . Config::get('action_suffix')], $vars);
}
}
public static function instance($class, $method = '')
{
static $_instance = [];
$identify = $class . $method;
if (!isset($_instance[$identify])) {
if (class_exists($class)) {
$o = new $class();
if (!empty($method) && method_exists($o, $method)) {
$_instance[$identify] = call_user_func_array([ & $o, $method], []);
} else {
$_instance[$identify] = $o;
}
} else {
throw new Exception('class not exist :' . $class, 10007);
}
}
return $_instance[$identify];
}
public static function parseName($name, $type = 0)
{
if ($type) {
return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function ($match) {return strtoupper($match[1]);}, $name));
} else {
return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
}
}
public static function parseClass($module, $layer, $name)
{
$name = str_replace(['/', '.'], '\\', $name);
$array = explode('\\', $name);
$class = self::parseName(array_pop($array), 1);
$path = $array ? implode('\\', $array) . '\\' : '';
return APP_NAMESPACE . '\\' . (APP_MULTI_MODULE ? $module . '\\' : '') . $layer . '\\' . $path . $class;
}
~~~
* * * * *
## 2 分析
1 table($name='',arrat $option)
實例化以$name為名字的Model對象
`public static function table($name = '', array $options = []){}`
創建一個靜態變量數組$_model緩存所有實例化的Model對象。
* * * * *
2 model($name='',$layer)
實例化以$name為名字的Model對象
`public static function model($name = '', $layer = MODEL_LAYER){}`
同上 使用靜態變量數組$_model緩存
對比table()與model()
table()創建無模型文件的的Model。直接對應數據表
model()創建有模型文件關聯的Model。對應模型的子類
* * * * *
3 controller()
實例化以$name為名字的控制器
`public static function controller($name, $layer = '', $empty = ''){}`
創建一個靜態變量數組$_instance緩存所有實例化的控制對象
* * * * *
4 db($config=[])
根據配置創建數據庫連接對象。
`public static function db($config = []){}`
* * * * *
5action()
遠程調用url對應的控制器方法
`public static function action($url, $vars = [], $layer = CONTROLLER_LAYER){}`
使用self::controller()創建url對應控制器
使用App::invokeMethod()調用對應控制的action方法
* * * * *
6 instance()
創建$class對應的類,如果存在$method,則調用對象的$method
`public static function instance($class, $method = ''){}`
使用$_instance 緩存創建的對象
* * * * *
7parseName()
轉換字符串命名風格
`public static function parseName($name, $type = 0){}`
* * * * *
8 parseClass()
解析類名到系統中命名空間模塊分層下的目錄類名文件
`public static function parseClass($module, $layer, $name){}`
* * * * *
* * * * *
## 3 使用方法
TODO
## 4 總結
自動加載器的實例化方法用來實例化對象并緩存。
- 更新記錄
- 概述
- 文件索引
- 函數索引
- 章節格式
- 框架流程
- 前:章節說明
- 主:(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(自動加載)