ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:50.73KB ,
资源ID:8183878      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8183878.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ThinkPHP代码分析核心.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ThinkPHP代码分析核心.docx

1、ThinkPHP代码分析核心前言 TP的手册相当多,其实不必再出这样的贴子,论技术,我也是菜鸟一个,同时也在学习当中。看到论坛上多了不少新朋友,不少在抱怨手册看不懂,那我就姑且抛砖引玉,尝试与新朋友们更简单地、手把手地进入TP的应用中去。讲解过程中有错的地方,大家帮忙指正。这个系列,初步定下的目标为,从零开始,以TP示例中心中的Form为例进行讲解,以实践为主,理论为辅,将TP的最基本内容逛一遍,至少让我们一起学会如何进行最简单的对数据进行查、增、改、删操作并输出到模板。由于我们说的是循序渐进,所以我用步骤式来说明,只要一步一步跟着做,相信聪明的你在使用过程中就会明白TP的应用了。注意:以下的

2、步骤,仅仅是TP灵活的布署方式其中一种,实际开发中可以根据自己的情况去另行设定。至于为什么那样做,我们会在最后再作总结,我觉得先实操然后再进行说明比较容易明白。以下不再重复解释。一快速开始一个项目名词解释: 项目:你要开发的系统,称之为项目。入口文件:你可以理解为这个项目的唯一的一道门,以后所有的操作都会通过这道门去执行处理。不必理会什么意思,你甚至可以先把它看成是就是入口文件TP: ThinkPHP框架的简称1 下载正式版2 拟好你的项目名称,我们这里以 Myapp 为项目名称3 在www根目录下,将TP框架所有文件全部复制过去,文件夹名称是ThinkPHP4 与ThinkPHP同级新建一个

3、文件夹,起名为 Myapp,也就是项目名称5 在www根目录下,创建一个PHP文件,起名,这就是入口文件入口文件代码: display()方法来直接调用该模板。(当然也可以调用其它模块下的其它模板或显式指定模板文件位置和名称,由于是循序渐进式的学习,就让我们先忽略吧)了解这些理论后,我们先简单实操一下这些知识。1 在Myapp/Tpl/default/下建立一个文件夹,根据应用模块的名称,我们将这个文件夹命名为Index2 在Myapp/Tpl/default/Index/下建立一个html文件,根据操作名称,我们命名该文件为assign(name,$value); $this-display

4、(); 代码知识要点(摘自手册:ThinkPHP模板指南,此后的知识要点均来自TP官方手册,不再申明)在Action类里面使用 assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值。 $this-assign(name,$value);taccess文件,内容是 RewriteEngine on RewriteCond %REQUEST_FILENAME !-d RewriteCond %REQUEST_FILENAME !-f RewriteRule (.*)$ $1 QSA,PT,L 如果你的服务器环境支持rewrite,使用就可以正常访问到Index模块的index

5、操作了。 此后我们的学习中用到的URL,都是假定你使用了rewrite的情况第六节 CURD知识之一 C 创建(create)从这一节开始,我们就要涉及到数据库操作,TP对数据库的操作非常简便,以下是一些基础知识讲解。名词解析:CURD:代表数据库四个基本操作:创建:create,更新:update,读取:read,删除:delete模型对象:即数据对象,你项目里每一个Model类文件都会对应着一个数据表(或者视图),模型与数据表存在一种映射关系。TP约定了命名要遵循一定的规范,如果不符合,则需要根据情况进行额外的相应设置。例如Model类的tableName属性-模型(M)同时也在Myapp

6、/Lib/Action/下添加了一个Index应用模块和写下了一个index操作-控制器(C)并且在Tpl目录下建立了与之对应的模板目录Index及模板文件 -视图(V)MVC模式的开发已体现了出来。tdweb曾简明扼要地概括了TP中这三者的关系, C的作用,就是从M中取得数据到V,使用TP以表单提交数据到库,流程和你所了解的表单提交没有什么区别,只是TP简化了数据操作的处理过程。我们在实际操作中体会一下。先来看看我们所定义的数据表form的字段: id,下面主要说说function与callback这两个附加规则。 protected $_auto=array(array(create_ti

7、me,time,ADD,function),);上面create_time代表了要处理的字段,填充内容是time,附加规则是function使用函数,填充条件是ADD新增时处理,那么整行代码表示对create_time字段在新增的时候使time函数作为该字段的值进行自动填充。再看一个function作为附加规则的例子 protected $_auto=array(array(password,md5,ADD,function),);当使用function作为附加规则时,第二个填充内容就代表了这个因子是一个函数名称,该函数的参数就是代表填充字段的值,比如password的值是123456,则上面

8、的代码会先将这个值使用函数md5(123456),这样处理后再插入到数据表中去。对于function(函数)和callback(回调方法)理论是一样的,只不过一个是表示填充内容所写的是函数名,另一个是表示填充内容是类中的方法名。函数可以是PHP5内置函数或你自己所写的函数。而callback是当前模型类所能调用的一个方法。有关数据填充方面的详细资料,请参看官方使用手册 ThinkPHP数据操作指南2 打开Myapp/Tpl/default/Index/文件,我们修改代码将form写进去 !DOCTYPE HTML PUBLIC - 返 回 ); 步1:将根目录中的原剪切并粘贴到Myapp文件夹

9、下。更改代码为: php /ThinkPHP); ; /); taccess文件复制一份粘贴到Myapp目录下。步3: 将Cache目录,Temp目录,Data目录清空。说明2 第五节中对于URL访问的默认模式在dev版默认配置中,dispatch即URL调度功能是关闭的,所以在默认模式下,要访问Index模块的index操作,地址应是:m=index&a=index,m指的是模块变量(Model),a指的是操作变量(Action)。如果要使用类似第五节中的moduleName/actionName方式,则要在文件里设置DISPATCH_ON为true;并且,也只有开启了此功能后,URL_MO

10、DEL的设置才会有效。(在上面的章节我们提及过,可以设置URL_MODEL为2来使用rewrite功能去除显示所以,现在我们的代码是 mysql, 那么再来看看我们所定义的数据表form的字段: id,使用ADD | UPDATE | ALL会无效的(TO流年大哥:TP代码还有一个特色就是函数或方法的命名很符合语言使用习惯,原来的add,update,all很直观,易记,可惜没了)array(field,填充内容,填充条件,附加规则,额外参数)alias_import($alias,$classfile=)快速定义和别名导入这是新增的函数,我尝试注解一下,不正确请指正。该函数可以动态设置文件列

11、表导入和直接导入文件,常会用到的文件别名有 当要引入已定义别名的文件,我们只要直接在参数中传递别名就行了。别名可以自行在ThinkPHP/Common/中扩充。除了使用已定义的别名外,也可以使用动态指定。 alias_import(zzg,APP_PATH./Lib/ORG/);或一次引入多个文件 $ailias=array( Abc= APP_PATH./Lib/ORG/, Efg =APP_PATH./Lib/Other/,);alias_import($ailias);注:指定文件或别名不存在时会返回false类似的函数还有import($class,$baseUrl = ,$ext=.

12、)由于性能问题,这个方式以后不再支持这是ThinkPHP内建的类库和文件导入的一个函数,具有缓存和检测机制,相同的文件不会重复导入,冲突时会提示错误。使用这方法时,系统会自动识别导入类库文件的位置:Think 代表TP框架基类库 即ThinkPHP/Lib/Think目录ORG 代表第三方公共类库 即ThinkPHP/Lib/ORG目录TP的约定是Think、ORG等导入的是以系统(TP)基类库为相对起始目录,否则就认为是项目(Myapp)应用类库为起始目录。注意1 使用时要注意文件名的大小写注意2 Import会自动将.转换为/,如果文件名中含有.,则要将.改为#才能正常导入。注意3 导入的

13、类文件后缀默认是.2 第三方框架类库导入:vendor($class,$baseUrl = ,$ext=.php),起始目录统一是ThinkPHP/Vendor 默认后缀是.php 注:vendor也使用了Import函数。因此.说明3,原来的模板文件保持不变,因为我们已启用了DISPATCH_ON开关。仅将Myapp/Lib/Action/如下 select(); 返 回 ); $rs =$Form-add(); 返 回 ); oxwidth:600px;margin:10px auto;border:1px dashed #e8e8e8;padding:5px;.submitheight:

14、2em;padding:0 5px;cursor:pointer; 标题: 邮箱: 内容: $:$-由 $ 发表于: $|date=Y-m-d,#内容:$在浏览器中输入,可以看到现在已将数据显示在模板了这时我们只要每输入一条数据信息,就会按照id倒序的方式显示在模板上。现在模板显示已设定好,我们来一起学习查询的各种方法:先了解一个TP词汇:连贯操作 所谓连贯操作,是TP利用_call方法来实现的一些特殊的Model类方法,可以对数据对象连续调用数个方法(参数)来设定特定的条件,然后执行最终所指定的操作,这类特定方法的命名都很直观易记,主要方法(参数)有用于查询表达式的 field参数支持如下键

15、名 table 指定表名称,可以跨表访问,若不填则是当前DAOdistinct 指定是否只列出不重复数据,如果想列出不重复数据,则为true,不填则无此功能field 指定要搜索的字段,不填则为*join 填写join,可以支持数组或者直接使用字符串,如果是字符串,那么只支持LEFT JOIN,如果想使用RIGHT JOIN,那么只能使用数组定义,并且必须写清RIGHT JOIN where 指定查询条件where可以多说点,功能很多。首先说最简单的字符串查询,直接执行就OK了。使用数组指定查询条件 $whereArr=array( account=tdweb, home=China ); $

16、options=array( where=$whereArr ); $Dao-select($options);这样默认是查询SELECT * FROM test WHERE ( account = tdweb ) AND ( home = China )是查询相等条件的。那如果我想查询like条件怎么办解决方法之一是定义LIKE_MATCH_FIELDS配置,这里指明要进行like查询的字段。现在我们稍微改下程序 public function testDb() C(LIKE_MATCH_FIELDS,account); $Dao=D(Test); $whereArr=array( acco

17、unt=tdweb, home=China ); $options=array( where=$whereArr ); dump($Dao-select($options); echo $Dao-getLastSql(); 得到的SQL就是SELECT * FROM test WHERE ( account LIKE %tdweb% ) AND ( home = China )接着,可以看如下代码 public function testDb() $Dao=D(Test); $whereArr=array( account=array(eq,tdweb), home=array(like,%C

18、hi%), age=array(between,1,3) ); $options=array( where=$whereArr ); dump($Dao-select($options); echo $Dao-getLastSql(); 这里的$whereArr定义为一个二级数组,没一个字段都定义了一个数组,这样可以支持更高级复杂的查询。其中支持的关键字: EQ 相等NEQ 不相等GT 大于EGT 不大于LT 小于ELT 不小于NOTLIKE 不相似LIKE 相似NULL 空NOTNULL 不为空EXP 使用自己写的表达式同样,select也支持一个名为“_after_select”的回调方法

19、如何去消化这段内容,将在下一节以我们的实例Myapp中实操去体会。第 8 节 视图查询ThinkPHP提供了视图查询应用,利用视图查询可以将多个数据表的字段内容按需要进行指定和筛选,组织成一个基于这些数据表的视图模型,然后就可以通过该模型直接进行多表联合查询,非常方便和简单。例如在项目中,我们定义有三个表,user 用户基础表,user_info 用户详细信息表,dept 部门分类表现在我们需要获取某个用户信息,该信息要包括用户的帐号名称和相关资料与及所在部门的名称,这时候我们可以利用视图查询进行处理。让我们在实际操作中去体会。1 构建一个新项目并进行相关配置(可参考前面的教程,这里省略)2

20、创建一个数据库tpview,并添加这三个表 用户表 CREATE TABLE think_user (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ID编号,name varchar(20) NOT NULL COMMENT 帐户,password varchar(32) NOT NULL COMMENT 密码,dept_id smallint(6) unsigned NOT NULL,status tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT 开放状态,PRIMARY KEY (id)

21、ENGINE=MyISAMDEFAULT CHARSET=utf8 COMMENT=会员表 AUTO_INCREMENT=2 ;INSERT INTO think_user (id, name, password, dept_id, status) VALUES(1, zzguo28, 123456, 2, 1); 用户信息表 CREATE TABLE think_user_info (user_id int(11) NOT NULL COMMENT 用户id,nick_name varchar(30) NOT NULL COMMENT 用户昵称,email varchar(100) NOT

22、NULL COMMENT 邮箱地址,address varchar(100) NOT NULL COMMENT 详细地址,gender tinyint(1) NOT NULL DEFAULT 0 COMMENT 性别,mobile varchar(100) NOT NULL COMMENT 手机号码,telephone varchar(100) NOT NULL COMMENT 电话号码,KEY user_id (user_id) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT=用户信息表;INSERT INTO th

23、ink_user_info (user_id, nick_name, email, address, gender, mobile, telephone) VALUES(1, 国路think街号 部门分类表 CREATE TABLE think_dept (id smallint(3) NOT NULL AUTO_INCREMENT,name varchar(50) NOT NULL,PRIMARY KEY (id) ENGINE=MyISAMDEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;INSERT INTO think_dept (id, name) VAL

24、UES(1, 开发部),(2, 销售部),(3, 财务部);3 在项目/Lib/Model下创建这三个表的基础模型Model本示例没涉及到验证等其它功能,所以只要简单定义测可,例如 其实视图模型对应的数据表并非一定要有相应的的基础模型,但是建议您创建,这样单表和视图都可以操作。4 创建视图模型,代码如下,详细注解见其后:(最新svn上已增加动态扩展模型功能,使用新版需要将protected属性改为public属性,建议使用动态扩展功能去使用视图查询,而不再是本教程的继承方式。那样使用会更灵活。array(id,name,_as=u,_type=left), UserInfo=array(ema

25、il,mobile,_as=ui,_on=), Dept =array(name=dept,_on=), );逐行解释上面的代码:在行2代码中,因为版已将视图查询分离出原Model类,所以这里需要使用import方法引入了视图模型类。行3代码中,定义了该模型名称为UserViewModel,视图模型的名称Model前的命名是随意的,只是为了有别于其它模型,通常我们会以xxxViewModel这样的方式去命名。并且一定要继承ViewModel。版无需再设置模型的viewModel属性为true,只要继承ViewModel则可)第四行代码$viewFields 属性表示视图模型包含的字段,每个元素定义了各个数据表或者模型所需的字段。格式是 protected $viewFields = array( 表名=array(所需字段,_as=别名定义,_on=筛选条件,_type=指定join类型,支持right,inner,left三种),);是否留意到行7代码中的name=dept,因为User模型里面已经存在了一个name字段,所以我们通过这种方式把Dept模型的name字段映射为d

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1