thinkphp框架起步认识

先看看thinkphp的文档吧:这是我在网上找的一个不错的链接地址,对自己有用,同时相信对读者也有用吧。

http://doc.thinkphp.cn/manual/class.html

                                                      ThinkPHP 跨模块调用操作方法(A方法与R方法)

跨模块调用操作方法
前面说了可以使用 $this 来调用当前模块内的方法,但实际情况中还经常会在当前模块调用其他模块的方法。ThinkPHP 内置了 A 方法与 R 方法这两个特殊的大写字母方法来处理跨模块调用的问题。

目前 Index 模块内有 index 操作,User 模块有 showName 操作,User 模块及 showName 操作具体代码如下:

  1. <?php 
  2. class UserAction extends Action{ 
  3. public function showName(){ 
  4. echo "我叫小明。"
  5. ?>
我们将在 Index 模块的 index 操作中调用上面的 showName 操作。
通过 A 方法跨模块调用操作
A 方法用于实例化其他模块(当于 new 关键字),模块被实例化之后,就可以以对象的方式调用模块内的操作。
在 Index 模块的 index 操作中调用 User 模块的 showName 操作实例:
  1. <?php 
  2. class IndexAction extends Action{ 
  3. public function index(){ 
  4. header("Content-Type:text/html; charset=utf-8"); 
  5. // 实例化 User 模块 
  6. $User = A('User'); 
  7. // 调用 User 模块中的方法 
  8. $User->showName(); 
  9. ?>
A 方法还支持跨分组调用和跨项目调用模块,语法如下:
A('<项目名://><分组名/>模块名')
// 常用例子如下
A('User') //调用当前项目的 User 模块,如上面的例子
A('Admin://User') //调用 Admin 项目的 User 模块
A('Admin/User') //调用 Admin 分组的 User 模块
A('Admin://Tool/User') //调用 Admin 项目 Tool 分组的 User 模块

ThinkPHP 还提供了 R 方法,可直接调用其他模块的操作方法,将上面使用 A 方法的例子更改为 R 方法:

  1. <?php 
  2. class IndexAction extends Action{ 
  3. public function index(){ 
  4. header("Content-Type:text/html; charset=utf-8"); 
  5. // 调用 User 模块中的方法 
  6. R('User/showName'); 
  7. ?>
R 方法同样也支持跨分组调用和跨项目调用方法,语法如下:
R('<项目名://><分组名/>模块名/操作'<, array()>)
// 常用例子如下
R('User/showName') //调用当前项目的 User 模块的 showName 方法,如上面的例子
R('Admin://User/showName') //调用 Admin 项目 User 模块的 showName 方法
R('Admin/User/showName') //调用 Admin 分组 User 模块的 showName 方法
R('Admin://Tool/User/info') //调用 Admin 项目 Tool 分组的 User 模块的 info 方法
R 方法接收参数
R 方法也支持对调用的方法传入参数,因为实际上调动的操作,可能是需要传入参数的。
R 方法的第二个参数为数组,该数组将作为被调用操作的参数传入。如下面的例子所示:
R( 'User/showName',array($_GET('id')) );//这个时候,你可以使用//http://localhost/Index.php/Index/output/name/gaoke访问
该例子表示 showName 操作将接受 5 这样一个参数。而对应的 showName 操作可能为:
  1. <?php 
  2. class UserAction extends Action{ 
  3. public function showName($id){ 
  4. // 根据 id 参数获取用户信息的代码 
  5.      echo "你输入的ID是:".$id;
  6. ?>

要传入多个参数,那么将 R 方法的 array() 参数数组依次定义多个元素即可。

ThinkPHP 读取配置信息与动态配置(C方法)

C 方法是 ThinkPHP 内置的特殊方法,用于在操作和模板里读取配置文件里的配置信息或者动态配置参数。语法如下:
  1. C( para_name, value )
参数说明
如果只有 para_name 参数时,表示读取 para_name 配置参数的值;para_name 与 value 都存在时,表示设置 para_name 参数的值为 value。
C 方法读取配置参数值
假设项目配置里有如下配置信息:

  1. /* Cookie设置 */ 
  2. 'COOKIE_EXPIRE' => 3600, // Coodie有效期 
  3. 'COOKIE_DOMAIN' => '.5idev.com'// Cookie有效域名 
  4. 'COOKIE_PATH' => '/'// Cookie路径 
  5. 'COOKIE_PREFIX' => ''// Cookie前缀
下面是在模板里面读取配置参数的例子:
  1. <title>{:C('COOKIE_EXPIRE')}</title>
配置文件中支持二维数组的配置,那么要读取二维配置,可以使用 . 符号来表示层级:

  1. C('SITE_CONFIG.DOMAIN_NAME')
当读取的参数没有在配置文件里定义时,C 方法返回 NULL。
ThinkPHP 动态配置
ThinkPHP 惯例配置与项目配置都是通过预先定义配置文件的方式来配置需要的参数,而在具体的操作方法里面,还可以通过 C 方法来动态改变或新增配置参数。
下面的例子将 Coodie 有效期变更为 7200 秒:
  1. C('COOKIE_EXPIRE',7200);
同样动态配置二维数组参数,通过 . 符号来区分层级关系:
  1. C('SITE_CONFIG.DOMAIN_NAME','example.com')

 D方法

 默认的 D方法 只能支持调用当前项目的模型,如果需要跨项目调用,需要使用:


  1. $User = D('User''Admin'); // 实例化 Admin 项目下面的 User 模型 
  2. $User = D('Admin.User'); // 启用了项目分组

查看 D快捷方法 实例:《ThinkPHP 表单数据智能写入 create 方法》
实例化空模型类

如果需要使用原生 SQL ,需要实例化一个空模型:

  1. $Model = new Model(); 
  2. // 执行原生 SQL 语句 
  3. $Model->query('SELECT * FROM think_user');

ThinkPHP 中M方法和D方法的具体区别


阅读:45   收藏
M方法和D方法的区别

ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实

例化一个用户定义模型类。
使用M方法

如果是如下情况,请考虑使用 M方法:

对数据表进行简单的 CURD 操作而无复杂的业务逻辑时
只有个别的表有较为复杂的业务逻辑时,将 M方法 与实例化 CommonModel 类进行结合使用

M方法 甚至可以简单看着就是对参数表名对应的数据表的操作:

$User = M('User');

使用D方法

如果是如下情况,请考虑使用 D方法:

需要使用 ThinkPHP 模型中一些高级功能如自动验证功能(create()方法中实现)、关联模型等
业务逻辑比较复杂,且涉及的表众多
将业务逻辑定义在了自定义的模型类里面(Lib/Model目录下),而想在操作中实现这些业务逻辑

另外 D方法 不支持跨项目调用,需要使用:

  1. $User = D('User''Admin'); // 实例化 Admin 项目下面的 User 模型 
  2. $User = D('Admin.User'); // 启用了项目分组

提示

启用了项目分组后,Model 类并不必然对应着项目分组。多个项目组之间共有的模型类,统一放在 Model 目录下

,可以直接使用D('ModelName') 实例化。而 D('User.UserInfo') 并不表示 User 一定是一个项目分组,也可以

仅仅是对 Model 下文件的一个分类目录,D('User.UserInfo') 实例化的是 User 目录下的 UserInfo 模型类。
总结

M方法 和 D方法 都可以在模型类文件不存在的情况下直接使用的,但显然 M方法 更高效;但要使用模型类里面

业务逻辑,就必须使用 D方法。

一个比较形象的比喻就是:M方法 就如一台刚装好操作系统的电脑,只能使用一些基本功能;而 D方法 就如在装

好的系统上再安装了一些如 Office、QQ 等应用软件,功能更加强大,同时整个电脑运行速度也变慢了。

以上是对 M方法和D方法区别的一些总结,M方法 和 D方法 要根据实际情况来具体选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode403 青蛙过河

一只青蛙想要过河。 假定河流被等分为 x 个单元格&#xff0c;并且在每一个单元格内都有可能放有一石子&#xff08;也有可能没有&#xff09;。 青蛙可以跳上石头&#xff0c;但是不可以跳入水中。 给定石子的位置列表&#xff08;用单元格序号升序表示&#xff09;&#xff…

PaperNotes(8)-Stein Variational Gradient Descent A General Purpose Bayesian Inference Algorithm

通用贝叶斯推理算法-Stein Variational Gradient DescentAbstract1 Introduction2 Background3 Variational Inference Using Smooth Transforms3.1 Stein Operator as the Derivative of KL Divergence定理3.1引理3.23.2 Stein Variational Gradient Descent4 Related Works5 …

thinkphp的增删改查

ThinkPHP 添加数据 add 方法 ThinkPHP 内置的 add 方法用于向数据表添加数据&#xff0c;相当于 SQL 中的 INSERT INTO 行为。ThinkPHP Insert 添加数据添加数据 add 方法是 CURD&#xff08;Create,Update,Read,Delete / 创建,修改,读取,删除&#xff09;中的 Create 的实现&a…

leetcode115 不同的子序列

给定一个字符串 S 和一个字符串 T&#xff0c;计算在 S 的子序列中 T 出现的个数。 一个字符串的一个子序列是指&#xff0c;通过删除一些&#xff08;也可以不删除&#xff09;字符且不干扰剩余字符相对位置所组成的新字符串。&#xff08;例如&#xff0c;"ACE" 是…

ThinkPHP 模板循环输出 Volist 标签

volist 标签用于在模板中循环输出数据集或者多维数组。volist 标签在模块操作中&#xff0c;select() 方法返回的是一个二维数组&#xff0c;可以用 volist 直接输出&#xff1a;<volist name"list" id"vo"> 用 户 名&#xff1a;{$vo[username]}&l…

MachineLearning(9)-最大似然、最小KL散度、交叉熵损失函数三者的关系

最大似然-最小KL散度-最小化交叉熵损失-三者的关系问题缘起&#xff1a;给定一组数据(x1,x2,...,xm)(x^1,x^2,...,x^m)(x1,x2,...,xm),希望找到这组数据服从的分布。此种情况下&#xff0c;分布规律用概率密度p(x)表征。 问题归处&#xff1a;如果能够建模/近似建模p(x)&#…

ThinkPHP redirect 页面重定向使用详解与实例

ThinkPHP redirect 方法ThinkPHP redirect 方法可以实现页面的重定向&#xff08;跳转&#xff09;功能。redirect 方法语法如下&#xff1a;$this->redirect(string url, array params, int delay, string msg) 参数说明&#xff1a;url 必须&#xff0c;重定向的 URL 表达…

PaperNotes(9)-Learning deep energy model: contrastive divergence vs. Amortized MLE

Learning deep energy model: contrastive divergence vs. Amortized MLEabstract1 Introduction2 Background2.1 stein variational gradient descent2.2 learning energy model**contrastive Divergence**abstract 受SVGD算法的启发,本文提出两个算法用于从数据中学习深度能…

windows下的gvim配置

首要任务是下载安装Gvim7.3 。 安装完后&#xff0c;gvim菜单中文出现乱码&#xff0c;在_vimrcset文件中增加&#xff1a; " 配置多语言环境,解决中文乱码问题 if has("multi_byte") " UTF-8 编码 set encodingutf-8 set termencodingutf…

leetcode104 二叉树的最大深度

给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 / \ 15 7 返回它的最大深度…

C++的安全类型转换的讨论

关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_ca…

PaperNotes(10)-Maximum Entropy Generators for Energy-Based Models

Maximum Entropy Generators for Energy-Based ModelsAbstract1 Introduction2 Background3 Maximum Entropy Generators for Energy-Based Models4 Experiments5 Related Work6 Conclusion7 AcknowledgementsAbstract 由于对数似然梯度的难以计算&#xff0c;能量模型的最大似…

leetcode105 前序中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a; 3 / \ 9 20 / \ 15 7 思路&#xff1a; 1、…

c++的虚拟继承 的一些思考吧

虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class …

对于linux socket与epoll配合相关的一些心得记录

对于linux socket与epoll配合相关的一些心得记录 没有多少高深的东西&#xff0c;全当记录&#xff0c;虽然简单&#xff0c;但是没有做过测试还是挺容易让人糊涂的int nRecvBuf32*1024;//设置为32Ksetsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int))…

leetcode144 二叉树的前序遍历

给定一个二叉树&#xff0c;返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 思路&#xff1a;模仿递归的思路压栈即可。 /*** Definition for a bi…

AJAX大总结

1、AJAX概述 1.1 什么是AJAX AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互&#xff0c;传输的数据为XML&#xff08;当然&#xff0c;传输的数据不只是XML&#xff09;。 …

我对STL的一些看法(一)初步认识STL

后面一段时间我将会给大家分享我自己学到STL以及应用的时候遇到的问题还有他的一些精髓,可能开始的逻辑会有些乱吧,不过后面还会不断的整理和优化,让自己看明白也让更多的读者看的清楚。 最近刚闲下来,先说说什么是STL: 不知道你是否有过这样的经历。在大学,你准备着手完…

PaperNotes(12)-Autoregressive Quantile networks for generative modeling

Autoregressive Quantile networks for generative modeling3 autoregressive implicit quantiles3 autoregressive implicit quantiles autoregressive&#xff1a;自身做回归变量&#xff0c;用之前若干时刻的随机变量 来建模 之后某些时刻 随机变量的模型。 N维随机变量的…

我对STL的一些看法(二)认识vector容器

先说vector吧。 C++ Vector(向量容器) 是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。 vector 的数据安排以及操作方式,与 array 非常像似。两者的唯㆒差别在于空间的…