[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(自动加载)