欢迎大家访问我自己架的博客站点 码厩技术博客!

1、实例化一个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, '.')) {        // 确认Model类文件名是不是aaa.bbb.ccc结构
$array = explode('.', $name);
$name = array_pop($array); // 对于类似aaa.bbb.ccc结构文件名的Model类,只取到第一节
$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;
}

2、实例化一个没有模型文件的Model

function M($name='', $class='Model') {
static $_model = array();
if (!isset($_model[$name . '_' . $class]))
$_model[$name . '_' . $class] = new $class($name);
return $_model[$name . '_' . $class];
}

3、Model类构造函数
public function __construct($name='',$connection='') {
// 模型初始化
$this->_initialize();
// 获取模型名称
if(!empty($name)) {
$this->name = $name;
}elseif(empty($this->name)){
$this->name = $this->getModelName();
}
// 数据库初始化操作
// 获取数据库操作对象
// 当前模型有独立的数据库连接信息
$this->db(0,empty($this->connection)?$connection:$this->connection);
// 设置表前缀
$this->tablePrefix = $this->tablePrefix?$this->tablePrefix:C('DB_PREFIX');
$this->tableSuffix = $this->tableSuffix?$this->tableSuffix:C('DB_SUFFIX');
// 字段检测
if(!empty($this->name) && $this->autoCheckFields) $this->_checkTableInfo();
}

总结:

  1. 避免重复加载一个模型,即,为了对同一个模型只实例化一次,两种方法中都使用了静态数组变量做实例化记录。
  2. D方法的返回结果有三种:name为空则返回空模型实例;已经实例化就返回实例;载入相应模型文件并返回实例。其中载入模型返回实例的具体操作分为两步:第一步,根据参数确认模型文件目录并载入模型文件。第二步,判断类是否已经存在,即是否加载成功,也就是说模型文件是否存在规定目录,然后使用加载模型文件或模型基类实例化模型,最后返回实例。
  3. M方法就是返回一个已经存在的实例或者返回一个新的(Model或者其他模型类)实例。

转载于:https://www.cnblogs.com/catroll/archive/2011/11/23/model_of_thinkphp.html

【ThinkPHP】实例化模型的方法相关推荐

  1. php yanzhengm,ThinkPHP 在使用M方法(不创建模型类)时实现自动验证与自动填充

    ThinkPHP M方法实现自动验证与自动填充 通常,我们会将自动验证与自动填充规则写入模型类里,然后再用 D 方法实例化模型类来实现对表单的自动验证与自动填充功能.由于 M 方法只是实例化基础模型类 ...

  2. php框架m方法详细,Thinkphp框架中D方法与M方法的区别是什么

    Thinkphp框架中D方法与M方法的区别是什么 发布时间:2021-02-06 23:09:38 来源:亿速云 阅读:69 作者:小新 小编给大家分享一下Thinkphp框架中D方法与M方法的区别是 ...

  3. ThinkPHP单字母函数(快捷方法)使用总结

    这篇文章主要介绍了ThinkPHP单字母函数(快捷方法)使用总结,对ThinkPHP的快捷方法做了针对性的归纳总结,需要的朋友可以参考下 在ThinkPHP中有许多使用简便的单字母函数(即快捷方法), ...

  4. ThinkPHP关联模型详解

    在ThinkPHP中,关联模型更类似一种mysql中的外键约束,但是外键约束更加安全,缺点却是在写sql语句的时候不方便,ThinkPHP很好得解决了这个问题.但是很多人不动关联模型的意思.现在就写个 ...

  5. 在thinkphp框架中如何对多表进行操作(thinkphp多表查询方法)

    在thinkphp框架中如何对多表进行操作(thinkphp多表查询方法) 本文讲解了在thinkphp框架中如何对多表进行操作,ThinkPHP是一个开源的PHP框架,是为了简化企业级应用开发和敏捷 ...

  6. php 如何封装类库,ThinkPHP里的import方法用于类库导入的封装实现实例详解

    ThinkPHP里的import方法用于类库导入的封装实现实例详解 分类:PHP_Python| 发布:佚名| 查看: | 发表时间:2014/7/1 import方法是ThinkPHP框架用于类库导 ...

  7. SuperMap BIM+GIS-Revit模型处理-第三节 Revit模型优化方法及模型缓存策略

    在模型导入SuperMap平台之后,在应用过程中必然会遇到性能问题,随之而来的就是如何优化模型.本文将总结使用经验和理解,从实际出发介绍几种优化方法和缓存策略.以下操作均在SuperMap iDesk ...

  8. 降低预测过程计算成本,这些NLP模型压缩方法要知道

    编译 | 凯隐 出品 | AI科技大本营(ID:rgznai100) 近年来,基于谷歌Transformer的语言模型在神经机器翻译,自然语言推理和其他自然语言理解任务上取得了长足进展. 通过多种语言 ...

  9. 模型融合方法最全总结!

    本文是模型融合的经验方法总结.包含了投票法.平均法.排序法.Stacking 和 Blending. 一.背景 之前有段时间打数据挖掘类比赛,看到很多选手用模型融合的技巧,特别是比赛后期的时候,很多选 ...

最新文章

  1. AO安装需要Microsoft Visual Studio 2013?
  2. msm8937+android7.1系统播放某个MP4文件在data分区下创建ramdump并生成很多elf文件问题
  3. linux文件常用权限,常用的更改Linux系统文件权限的命令
  4. Intel Realsense D435 如何获取摄像头的内参?get_profile() video_stream_profile() get_intrinsics()
  5. Canal实时同步数据到RocketMQ
  6. windowbuilder怎么加背景图_小红书引流:爆款笔记封面图怎么做?(内附教程)...
  7. linux fb应用例子,Linux下利用framebuffer画点的程序小例子
  8. 大数——大数阶乘(hdu1042)
  9. kafka python_kafka python
  10. Egret入门学习日记 --- 第十五篇(书中 6.1~6.9节 内容)
  11. Nginx+Memcached+Tomcat集群配置
  12. Qt的信号槽基本用法总结
  13. AD工程文件与原理图、PCB文件的储存关系
  14. wps分享变成小程序怎么变成文档_微信小程序使用腾讯文档打开文档
  15. 使用Aspose给PDF加密,免受未经授权的访问和内容篡改
  16. Java的位运算符详解实例——与()、非(~)、或(|)、异或(^)
  17. 9月9日资讯 星期四 农历八月(小) 初三
  18. Python获取Excel中超链接并下载至本地
  19. 平面设计零基础怎么设计出一个完美的名片
  20. java面试问题你遇到的难题_在Java面试中常遇到的技术问题汇总

热门文章

  1. [react-router] React-Router 4怎样在路由变化时重新渲染同一个组件?
  2. React开发(170):ant design datapicker限制选择时间
  3. 前端学习(3002):vue+element今日头条管理--模块介绍
  4. [html] websocket和socket有什么区别?
  5. [html] 写一个标签云的布局
  6. 第五十五期:MongoDB数据库误删后的恢复
  7. 第三十六期:学 Java 网络爬虫,需要哪些基础知识?
  8. 第七十四期:从bug看11种编程语言演化史,果然如今Python比较流行
  9. 第二十一期:老大难的GC原理及调优,这全说清楚了
  10. java学习(120):set的iterator