php框架ThinkPHP代码分析核心解析doc版.docx
《php框架ThinkPHP代码分析核心解析doc版.docx》由会员分享,可在线阅读,更多相关《php框架ThinkPHP代码分析核心解析doc版.docx(57页珍藏版)》请在冰豆网上搜索。
![php框架ThinkPHP代码分析核心解析doc版.docx](https://file1.bdocx.com/fileroot1/2023-8/19/76883601-f03e-4330-9da0-b4a371f129e5/76883601-f03e-4330-9da0-b4a371f129e51.gif)
php框架ThinkPHP代码分析核心解析doc版
前言
TP的手册相当多,其实不必再出这样的贴子,论技术,我也是菜鸟一个,同时也在学习当中。
看到论坛上多了不少新朋友,不少在抱怨手册看不懂,那我就姑且抛砖引玉,尝试与新朋友们更简单地、手把手地进入TP的应用中去。
讲解过程中有错的地方,大家帮忙指正。
这个系列,初步定下的目标为,从零开始,以TP示例中心中的Form为例进行讲解,以实践为主,理论为辅,将TP的最基本内容逛一遍,至少让我们一起学会如何进行最简单的对数据进行查、增、改、删操作并输出到模板。
由于我们说的是循序渐进,所以我用步骤式来说明,只要一步一步跟着做,相信聪明的你在使用过程中就会明白TP的应用了。
注意:
以下的步骤,仅仅是TP灵活的布署方式其中一种,实际开发中可以根据自己的情况去另行设定。
至于为什么那样做,我们会在最后再作总结,我觉得先实操然后再进行说明比较容易明白。
以下不再重复解释。
一 快速开始一个项目
名词解释:
项目:
你要开发的系统,称之为项目。
入口文件:
你可以理解为这个项目的唯一的一道门,以后所有的操作都会通过这道门去执行处理。
不必理会什么意思,你甚至可以先把它看成是index.php就是入口文件
TP:
ThinkPHP框架的简称
1下载TP1.5正式版
2拟好你的项目名称,我们这里以Myapp为项目名称
3在www根目录下,将TP框架所有文件全部复制过去,文件夹名称是ThinkPHP
4与ThinkPHP同级新建一个文件夹,起名为Myapp,也就是项目名称
5在www根目录下,创建一个PHP文件,起名index.php,这就是入口文件
入口文件index.php代码:
php
//定义ThinkPHP路径
define('THINK_PATH','./ThinkPHP');
//定义项目名称
define('APP_NAME','Myapp');
//定义项目路径
define('APP_PATH','./Myapp');
//加载入口文件
require(THINK_PATH.'/ThinkPHP.php');
//实例化这个项目
$App=newApp();
//执行初始化
$App->run();
>
就这么简单几行,然后打开浏览器,输入http:
//127.0.0.1/
一个TP项目就这样构建出来了。
你会看到
^_^Hello,欢迎使用ThinkPHP!
这行字。
并自动为你创建好项目的目录。
接下来,我们这个项目添砖加瓦。
二简单认识项目里的各个文件夹
名词解释:
Action:
模块控制器类,你暂时可以理解为一个Action文件代表着一个应用模块,Action文件中的每一个方法(function)代表着一个操作,操作分为有输出到模板的操作和只具执行不需要输出的操作。
对于有输出的操作,则代表了你的项目中一个展示给用户应用的web页面。
(注意:
这不是正统的术语解释)
Model:
数据表相对应的Model类,可以理解为一个Model文件对应着你项目数据库的其中一个表。
命名关系请参看这里:
在添砖加瓦之前,我们有必要认识一下各个文件夹的用途。
打开Myapp文件夹,里面TP已让你很省心地构建了最基本的目录。
其中:
Cache文件夹:
项目自动生成的模版缓存会出现在这里
Common文件夹:
你的项目中要用到的自己写的函数,可以在这个文件夹下创建一个名为common.php文件,在这个文件中书写函数,这些函数可以用在你项目的各个类,同时也可以在模板变量中使用,TP框架会自动加载。
Conf文件夹:
项目的运行配置文件config.php将放在这个文件夹里,(还有路由配置,调试配置等,请先忽略)
Data文件夹:
TP会把项目的数据库表字段生成到这里,另外。
。
。
那些先不必理会。
Lang文件夹:
项目的语言设置目录,先不必理会。
Lib文件夹:
应用类库目录,在这文件夹内还有两个文件夹:
Action和Model,Action目录放置命名为xxxAction.class.php的控制器文件,Model目录放置对应数据库表的命名为xxxModel.class.php的类文件。
Logs文件夹:
项目中自动产生的日志文件会存放在这里。
暂不必理会。
Temp文件夹:
数据缓存目录,存放项目中自动生成的项目运行缓存文件等,以及使用文件方式时的缓存文件等
Tpl文件夹:
模板文件目录,内有一个default文件夹,也就是默认的风格
项目生成的目录结构就先简单介绍到这里,下一步我们要简单地对项目进行最基本的配置。
三创建数据表,并对项目进行配置,以便连接到数据库。
1我们这里使用的是Mysql数据库,利用PhpMyadmin新建一个数据库,名称为myapp。
使用示例中心中的sql如下:
CREATETABLE`think_form`(
`id`smallint(4)unsignedNOTNULLauto_increment,
`title`varchar(255)NOTNULL,
`content`varchar(255)NOTNULL,
`create_time`int(11)unsignedNOTNULL,
`update_time`int(11)unsignedNOTNULL,
`status`tinyint
(1)unsignedNOTNULL,
`email`varchar(50)NOTNULL,
PRIMARYKEY (`id`)
)ENGINE=MyISAM DEFAULTCHARSET=utf8;
2在Conf文件夹内,建立一个config.php文件。
这个文件,就是Myapp项目的配置文件。
系统会自动加载
config.php文件中的配置是以数组返回方式进行定义,会覆盖TP框架中的common目录下convention.php的默认配置。
没有设置的配置,就以默认为准。
配置设置可以利用C函数动态改变,暂且不必理会。
而我们连接到数据库的设置也是在这个文件中书写。
config.php代码如下:
php
if(!
defined('THINK_PATH'))exit();
returnarray(
'DB_TYPE'=>'mysql',//使用的数据库是mysql
'DB_HOST'=>'localhost',
'DB_NAME'=>'myapp',//数据库名
'DB_USER'=>'root',
'DB_PWD'=>'123456',//填写你连接数据库的密码
'DB_PORT'=>'3306',
'DB_PREFIX'=>'think_',//数据表表名的前缀请参看
);
>
暂时就是这样,后面会再根据需要进一步添加和讲解。
3在Lib/Model目录下,创建一个文件,命名为FormModel.class.php。
命名规则刚才你已看了两次。
这里就不再多说,我们可以看到,数据表名是think_form,由于我们配置了数据表表名的前缀为think_,所以文件的命名直接使用"不含前缀的数据表表名+Model.class.php"就行了。
在这个文件中书写代码:
php
classFormModelextendsModel{
}
>
就这样定义一个类名就行了。
该类继承了Model类。
至于自动验证,自动过滤,自动填充这些,暂且不理会。
4提前先爽一下吧。
再次利用PhpMyAdmin,在该表中插入一些数据
sql如下:
INSERTINTO`think_form`(`id`,`title`,`content`,`create_time`,`update_time`,`status`,`email`)VALUES
(1,'这是测试数据','dfdf',1212724876,0,1,'************');
然后我们打开Myapp/Lib/Action/IndexAction.class.php文件,将里面的内容删掉。
改成下面这样:
php
classIndexActionextendsAction{
publicfunctionindex(){
$form=D('Form')->findall();
dump($form);
exit;
}
}
>
打开浏览器,输入http:
//127.0.0.1/,看,数据给输出来了。
PHP开发,无非是对数据库使用了逻辑控制的增删改查和使用模板输出数据内容。
通常数据的插入都是通过表单来进行添加。
表单提交涉及到页面显示,
所以这一节我们暂时放下对数据库的操作讲解,先来简单学习一下TP的模板引擎的变量输出。
第四节简单了解TP的模板输出
上一章节我们提及到,TP中的每一个xxxAction.class.php文件代表着一个应用模块,此Action中的每一个方法(function)代表着一个操作,操作分为有输出到模板的操作和只具执行不需要输出的操作。
打开Myapp/Lib/Action/IndexAction.class.php文件,我们看看里面的基础代码
classIndexActionextendsAction{
publicfunctionindex(){
}
}
理论知识:
1在TP开发中,要增加一个应用模块,就在Action文件夹里建立一个类,类的文件命名格式是模块名称+Action.class.php。
例如我们这里的应用模块是Index,所以定义文件名为IndexAction.class.php
2应用模块类的定义要继承框架的Action类。
要为这个应用模块添加一个操作,则定义一个以此操作为命名的function.例如上面的index操作。
通常一个应用模块中,会有若干操作(function)需要有与用户交互的页面,这就需要用到模板输出,TP本身已内置了一套具有TP特色的,很强大易扩展但应用非常方便兼简单的模板引擎。
在应有模块中,如果某个操作是需要页面显示的,只要对应在Myapp/Tpl/default/里建立一个文件夹,文件夹以应用模块的名称来命名,然后在这个文件夹下,建立一个以这个function名称来命名的html文件,就可以在这个方法中使用$this->display()方法来直接调用该模板。
(当然也可以调用其它模块下的其它模板或显式指定模板文件位置和名称,由于是循序渐进式的学习,就让我们先忽略吧)了解这些理论后,我们先简单实操一下这些知识。
1在Myapp/Tpl/default/下建立一个文件夹,根据应用模块的名称,我们将这个文件夹命名为Index
2在Myapp/Tpl/default/Index/下建立一个html文件,根据操作名称,我们命名该文件为index.html
3打开Myapp/Lib/Action/IndexAction.class.php文件,修改代码为
php
classIndexActionextendsAction{
publicfunctionindex(){
$value = 'hello,ThinkPHP';
$this->assign('name',$value);
$this->display();
}
}
>
代码知识要点(摘自手册:
ThinkPHP模板指南,此后的知识要点均来自TP官方手册,不再申明)
在Action类里面使用assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值。
$this->assign('name',$value);
//下面的写法是等效的
$this->name=$value;
//模板变量赋值后就需要调用模板文件来输出相关的变量,模板调用通过display方法来实现
$this->display();
4打开Myapp/Tpl/default/Index/index.html文件,代码为
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
{$name}测试输出:
{$name}
代码知识要点:
模板变量使用{$变量名称}这种标签进行输出。
不同的模板变量类型,使用不同的标签,标签可以自行另外定义,暂且不理会。
5打开浏览器输入地址:
http:
//127.0.0.1/,我们可以看到,定义的模板变量已经输出来了。
附加补充知识:
1如果要同时输出多个模板变量,可以使用下面的方式:
$array=array();
$array['name'] = 'thinkphp';
$array['email'] = '*****************';
$array['phone'] = '12335678';
$this->assign($array);
这样,就可以在模板文件中同时输出name、email和phone三个变量。
2我们使用上面的变量定义,将整个数组定义为一个模板变量来输出
$array=array();
$array['name'] = 'thinkphp';
$array['email'] = '*****************';
$array['phone'] = '12335678';
$this->assign('array',$array);
$this->display();
在html中,要输出$array['name']的值,代码是
{$array.name}或{$array['name']}
3将这个数组循环输出
3.1IndexAction.class.php中代码更改如下
php
classIndexActionextendsAction{
publicfunctionindex(){
$array=array();
$array['name'] = 'thinkphp';
$array['email'] = '*****************';
$array['phone'] = '12335678';
$value = 'hello,ThinkPHP';
$this->assign('array',$array);
$this->assign('name',$value);
$this->display();
}
}
>
3.2将Myapp/Tpl/default/Index/index.html代码更改如下:
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.0Transitional//EN">
{$name}
{$vo}
代码知识要点:
name='array'是指要循环的模板变量是array,id='vo'是指这个数据在模板输出时所使用的名称
对于TP的模板引擎输出先简单了解到这里。
第五节初步了解URL如何访问模块操作
通过前面的学习,我们已大概地明白了应用模块中的操作与模板如何对应。
而这一节将简单讲解如何通过URL来访问操作。
由于我们要循序渐进,所以先只介绍下面章节要用到的知识,要想深入学习还请参看官方手册《URL设计和SEO支持》
TP支持四种URL访问方式,默认是智能模式,所以我们就这种模式进行简要说明。
智能模式下的URL基本结构是这样的
http:
//servername/appName/moduleName/actionName/params
你可以理解为
http:
//服务器地址/入口文件位置/应用模块名称/具体操作名称/GET变量参数
解释一下上面文字中所译的URL结构,为什么appname项目名称我将它译成了入口文件位置:
通常情况下,我们的入口文件index.php都是放在根目录中,这时项目名称就会被入口文件index.php所替代。
在前几节里,我们已知道,一个Action文件就是一个应用模块,而应用模块中的每个方法(function)就是一个具体操作。
因此,假如要访问我们实例中的Index模块下的index操作。
地址应该是
http:
//127.0.0.1/index.php/Index/index
如果入口文件不是在服务器的根目录,而是在myapp目录下,那么入口文件位置就是Myapp/index.php,此时上面的URL访问就相应要换成
http:
//127.0.0.1/Myapp/index.php/Index/index
这样说理应很清楚了,不过别让这么多index给混乱咯,对应URL的结构去明白每一个index的函义,同时注意大小写
简单实操:
1打开Myapp/Lib/Action/IndexAction.class.php文件,在index这个function下再添加一个操作test
php
classIndexActionextendsAction{
publicfunctionindex(){
$array=array();
$array['name'] = 'thinkphp';
$array['email'] = '*****************';
$array['phone'] = '12335678';
$value = 'hello,ThinkPHP';
$this->assign('array',$array);
$this->assign('name',$value);
$this->display();
}
publicfunctiontest(){
header("Content-Type:
text/html;charset=utf-8");
echo'哈,访问正确!
!
';
}
}//类定义end
>
2尝试对应URL结构,来访问这个test操作,如果能成功看到echo的文字。
则这节我们又学会了多一点知识。
附加知识点:
去掉URL里面的index.php
要去掉URL里的入口文件index.php,使URL类似这样的形式
http:
//127.0.0.1/Index/index
可以按官方手册所提供的方法进行如下操作。
1确认httpd.conf配置文件中加载了mod_rewrite.so模块
2AllowOverrideNone将None改为All
3打开Myapp/Conf/config.php文件,在配置的数组中添加一行:
'URL_MODEL'=>2,在入口文件所在的同级目录下,新建一个.htaccess文件,内容是
RewriteEngineon
RewriteCond%{REQUEST_FILENAME}!
-d
RewriteCond%{REQUEST_FILENAME}!
-f
RewriteRule^(.*)$index.php/$1[QSA,PT,L]
如果你的服务器环境支持rewrite,使用http:
//127.0.0.1/Index/index就可以正常访问到Index模块的index操作了。
此后我们的学习中用到的URL,都是假定你使用了rewrite的情况
第六节CURD知识之一C创建(create)
从这一节开始,我们就要涉及到数据库操作,TP对数据库的操作非常简便,以下是一些基础知识讲解。
名词解析:
CURD:
代表数据库四个基本操作:
创建:
create,更新:
update,读取:
read,删除:
delete
模型对象:
即数据对象,你项目里每一个Model类文件都会对应着一个数据表(或者视图),模型与数据表存在一种映射关系。
TP约定了命名要遵循一定的规范,如果不符合,则需要根据情况进行额外的相应设置。
例如Model类的tableName属性
在第三节时,曾略为提到Model类文件命名,现在再回顾一下这部分的内容:
我们之前在数据库中,已建立了一个think_form数据库表,并且在配置文件config.php中,我们定义了数据表的前缀是think_,模型类(Model)文件的命名规则是:
不包括前缀的数据库表表名并且首字母大写+Model.class.php所以之前我们为think_form数据表在Myapp/Lib/Model目录下建立一个文件FormModel.class.php模型类的特殊命名还可以智能识别驼峰式的表命名,假设我们有个是类似think_new_table这样的表可以命名为NewTableModel.class.php。
默认配置便可以智能识别自动对应think_new_table表,因此不必修改配置。
开发过程中,只要简单地定义好与数据表对应的模型类(xxxModel.class.php),就可以进行对数据操作了。
如何让这个模型支持自动验证,自动填充,自动过滤这些知识,在下面涉及到时会作相应讲解。
一般来说,在表中添加数据都是通过表单来建立,为了更直观地学习CURD中的C,我们接下来建立个表单来进行添加数据的操作。
之前我们已在Myapp/Lib/Model/下建立好FormModel.class.php类----模型(M)
同时也在Myapp/Lib/Action/下添加了一个Index应用模块和写下了一个index操作----控制器(C)并且在Tpl目录下建立了与之对应的模板目录Index及index.html模板文件-------视图(V)MVC模式的开发已体现了出来。
tdweb曾简明扼要地概括了TP中这三者的关系,
C的作用,就是从M中取得数据到V,
使用TP以表单提交数据到库,流程和你所了解的表单提交没有什么区别,只是TP简化了数据操作的处理过程。
我们在实际操作中体会一下。
先来看看我们所定义的数据表form的字段:
'id',//