为了提高编程效率和便于统一管理,ThinkPHP创建了一系列快捷方法,这些快捷方法均以单个的大写字母命名,这些字母往往是代表了函数用途的英文单词的首字母。
这些方法包括:A—快速实例化Action类函数
,C—
存取配置参数值函数,D—快速实例化Model类函数,M—高效实例化Model类函数,L—
存取语言参数值函数,S—存取缓存函数,U—URL动态生成和重定向函数,等等。由于快捷方法里包含了ADSL,所以又称快捷方法为ADSL方法。
需要说明的是,ADSL方法中除G方法(记录和统计时间函数)外,其余方法都在系统函数库中定义,G方法在框架文件中定义,所以,一般情况下,
ADSL方法都会被编译缓存到~runtime.php文件中,也就是说所有的ADSL方法都是全局可见
的,在任何地方都可以调用ADSL方法。
在ADSL方法中四种比较基本,并且在基于ThinkPHP框架开发应用中经常使用的是
C,D,M和U这四种方法,其中,U方法的实现和用法较复杂,将放在另一篇文章《ThinkPHP源码分析系列—ADSL方法之U方法》中单独介绍,这里仅介绍前三种方法,即:C
方法,D方法和M方法。
一,C方法
// 获取配置值
function C($name=null, $value=null) {
static $_config = array();
// 无参数时获取所有
if (empty($name))
return $_config;
// 优先执行设置获取或赋值
if (is_string($name)) {
if (!strpos($name, '.')) {
$name = strtolower($name);
if (is_null($value))
return isset($_config[$name]) ? $_config[$name] : null;
$_config[$name] = $value;
return;
}
// 二维数组设置和获取支持
$name = explode('.', $name);
$name[0] = strtolower($name[0]);
if (is_null($value))
return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null;
$_config[$name[0]][$name[1]] = $value;
return;
}
// 批量设置
if (is_array($name))
return $_config = array_merge($_config, array_change_key_case($name));
return null; // 避免非法参数
}
可以看到,C方法接受两个参数,默认都为空。当两个参数都为空时,返回所有通过该方法配置的值,函数通过一个静态数组来存储这些值。当第一个参数不为空且为字符串时,将分析参数的命名规则。
如果参数命名中
不
包含“.”,则对参数进行小写转换处理,并且在第二个参数不为空的情况下,将两个参数以键值对的形式存储在静态数组中,否则返回已配置
参数的值或空。如果参数命名中包含“.”,则将参数按“.”分割为数组,并且在第二个参数不为空的情况下,将两个参数以键值对的形式存储在静态数组(二维数组)中,否则返回已配置参数的值或空。当第一个参数不为空且为数组时,则将该数组键名转换为小写后加入到静态数组中,最后返回静态数组。其余情况,为了避免非法参数,返回空值。
知道了C方法的实现之后,使用C方法就简单了。通过给C方法传递参数,
如果该参数在配置文件中已设置,
则可以获取该参数的值。C方法支持获取二维数组的配置值,只需在配置文件中定义好数组格式,通过向C方法传递用“.”连接的参数即可。
当向C方法传递第二个参数时,C方法就在对参数进行动态配置,第一个参数为配置项名称,第二个参数为配置项值。C方法支持通过点语法(.)配置二维数组的值。
二,D方法
/**
+----------------------------------------------------------
* D函数用于实例化Model
+----------------------------------------------------------
* @param string name Model名称
* @param string app Model所在项目
+----------------------------------------------------------
* @return Model
+----------------------------------------------------------
*/
function D($name='', $app='') {
static $_model = array();
if (empty($name))
return new Model;
if (empty($app))
$app = C('DEFAULT_APP');
if (isset($_model[$app . $name]))
return $_model[$app . $name];
$OriClassName = $name;
if (strpos($name, '.')) {
$array = explode('.', $name);
$name = array_pop($array);
$className = $name . 'Model';
import($app . '.Model.' . implode('.', $array) . '.' . $className);
} else {
$className = $name . 'Model';
import($app . '.Model.' . $className);
}
if (class_exists($className)) {
$model = new $className();
} else {
$model = new Model($name);
}
$_model[$app . $OriClassName] = $model;
return $model;
}
D方法用来实例化自定义业务逻辑的Model类。D方法包含两个参数,一个是模型类名称,一个是模型类所在项目,默认都为空。当系统找不到模型类时,会实例化基础模型类Model类,并返回实例化对象。当没有设置项目时,系统默认模型类在当前项目下。为了提高编程效率和代码重用性
,D方法允许使用点语法(.)来实现跨项目实例模型类,默认是实例当前项目下模型类。ThinkPHP通过检查模型类名称的命名规则,分别去
加载不同的模型类。接着,判断是否存在这些模型类,如果存在则实例化该模型类,不存在则实例化基础模型类Model。值得一提的是,D方法中定义了一静态数组来存储已实例化的模型类,如果模型类已实例化,系统将不会重复去实例化,这样就减少了内存的使用,提高了
应用性能。
三,M方法
/**
+----------------------------------------------------------
* M函数用于实例化一个没有模型文件的Model
+----------------------------------------------------------
* @param string name Model名称
+----------------------------------------------------------
* @return Model
+----------------------------------------------------------
*/
function M($name='', $class='Model') {
static $_model = array();
if (!isset($_model[$name . '_' . $class]))
$_model[$name . '_' . $class] = new $class($name);
return $_model[$name . '_' . $class];
}
M方法可看做D方法的一个特例。它将实例化一个没有模型文件的Model,即:没有定义自身业务逻辑,只能实现系统封装的CURD简单操作。当应用只是简单操作数据库时,使用M方法实例化对象是一种高效的选择。同样,M方法也不会去重复实例化模型类。
(完)
分享到:
相关推荐
二、ThinkPHP源码结构分析 2.1 源码目录结构:解压"thinkphp完整源码"后,可以看到包括Application、Conf、Controller、Model、View等主要目录,每个目录都有特定的功能和作用。 2.2 主要文件:如`index.php`作为...
134套thinkphp5网站模板源码,企业网站建站系统--thinkphp5模板,建站系统thinkPHP源码模板网站搭建SAAS 134套thinkphp5网站模板源码,企业网站建站系统--thinkphp5模板,建站系统thinkPHP源码模板网站搭建SAAS 134...
134套thinkphp5网站模板源码,企业网站建站系统--thinkphp5模板,建站系统thinkPHP源码模板网站搭建SAAS134套thinkphp5网站模板源码,企业网站建站系统--thinkphp5模板,建站系统thinkPHP源码模板网站搭建SAAS134套...
ThinkPHP问答社区系统源码,问答讨论社区系统源码,一套基本的问答讨论社区框架,基于thinkphp开发,只是部分不太完善,基础的问答模块还是比较完整的,有能力的大佬可以拿去二开一下使用的。 ThinkPHP问答社区系统...
本资源"拍卖网pc-wap-thinkphp源码.rar"正是基于这样的需求,采用ThinkPHP框架构建的一套完整的拍卖网站源码。本文将对ThinkPHP框架及其在拍卖网站开发中的应用进行详细解析。 首先,ThinkPHP是一个开源的PHP框架,...
【标题】"ThinkPHP框架源码交易系统资源网站源码"揭示了这是一个基于ThinkPHP框架构建的用于在线交易源码的网站系统。ThinkPHP是中国较受欢迎的PHP开发框架,它提供了一个快速、稳定且易于扩展的开发环境。该框架...
5. **集成第三方服务**:现代CRM系统可能需要集成邮件服务、短信通知、社交媒体分析等功能,ThinkPHP的扩展性使得这些集成变得容易。 6. **API接口**:对于多端应用,CRM系统可能需要提供API接口,与其他系统进行...
本资源包含130套专为ThinkPHP5框架设计的网站模板源码,是用于企业网站建设的理想选择,可以帮助开发者快速构建美观且功能完善的网站。 首先,我们要理解ThinkPHP5框架的核心特点。它采用了MVC(Model-View-...
通过以上分析,我们可以看出这个源码包涵盖了社交网站开发的关键组成部分,包括URL处理、缓存管理、图片处理、路由控制、配置管理以及权限控制等。对于学习ThinkPHP的人来说,深入研究这些文件将有助于掌握如何利用...
《深入解析ThinkPHP6.0框架源码》 ThinkPHP6.0是基于PHP语言的轻量级开发框架,以其高效、稳定、易用的特点深受开发者喜爱。它为快速构建Web应用提供了强大的支持,同时也为开发者提供了源码级别的学习资源。在深入...
2. **路由系统**:ThinkPHP的路由机制允许开发者灵活地定义URL模式,方便地映射到控制器方法,实现URL的美化和动态调度。 3. **数据库操作**:框架内置的数据库操作类库支持多种数据库,如MySQL、SQLite等,提供...
1. **路由系统**:ThinkPHP的路由机制允许灵活地定义URL与控制器方法的映射,方便实现URL美化和不同请求类型的处理。 2. **模型(Model)**:模型层是数据处理的核心,负责与数据库交互,可以实现增删改查等基本操作...
《深入解析ThinkPHP福娃源码交易网站源码》 ThinkPHP,作为国内广泛应用的开源PHP框架,以其简洁、高效、灵活的特点深受开发者喜爱。在众多的PHP项目中,福娃源码交易网站是一个典型的实例,它展示了ThinkPHP在构建...
thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码thinkphp开发发卡网源码...
通过对ThinkPHP2016版的源码分析,你可以深入理解其内部工作原理,比如路由解析、依赖注入、中间件机制等。这将有助于你在实际开发中更好地优化代码,提升项目的运行效率。 此外,资料包中的项目源码,是你实践和...
《OA微信办公thinkphp源码解析与应用》 在当今数字化办公环境中,OA(Office Automation,办公自动化)系统已经成为企业日常运营的重要工具。OA微信办公系统则是将OA系统与微信平台相结合,使得员工可以通过微信...
在`thinkPHP6源码.zip`压缩包中,包含的主要文件名为`tp6`,这可能是指整个框架的源代码目录。 以下是对ThinkPHP6框架的关键知识点的详细说明: 1. **MVC模式**:ThinkPHP6采用了Model-View-Controller(MVC)架构...
《深入解析ThinkPHP5框架源码》 ThinkPHP5(简称TP5)是中国最流行的PHP开发框架之一,它以其简洁的代码结构、丰富的文档和强大的功能吸引了大量的开发者。本篇文章将深入探讨ThinkPHP5的核心设计理念,主要框架...
基于原有代码开发,原博客地址:http://download.csdn.net/download/ruby97/4308196 修复一些后台问题,增加前台展示功能。 最终效果:http://eba.tech/xxx/ 后台地址:http://eba.tech/xxx/admin.php ...