Thinkphp学习笔记.docx
《Thinkphp学习笔记.docx》由会员分享,可在线阅读,更多相关《Thinkphp学习笔记.docx(29页珍藏版)》请在冰豆网上搜索。
![Thinkphp学习笔记.docx](https://file1.bdocx.com/fileroot1/2023-2/1/a2e5251e-c718-4de6-86a9-50355284ec6e/a2e5251e-c718-4de6-86a9-50355284ec6e1.gif)
Thinkphp学习笔记
Thinkphp复习
1、概况
使用面向对象的开发结构和mvc模式,采用单一入口,融合了struts2的action思想和jsp的taglib,ROR的orm映射和activerecord模式,封装了curd常用操作,支持多数据库切换,分布式数据库,缓存,用于敏捷web应用开发,简化企业级开发
2、什么是LAMP
LAMP是基于Linux,Apache,Mysql,PHP的开放资源网络开发平台
Linux是开放的操作系统
Apache是最通用的网络服务器
Mysql是带有基于网络管理工具的关系数据库
PHP是流行的对象脚本语言
LAMP是强大的网站解决方案
3、什么是OOP
面向对象编程(ObjectOrientedProgramming)是一种计算机编程架构
达到的目标:
重用性,灵活性,扩展性
基本原则:
计算机程序由单个能起到子程序作用的单元或对象组合而成,每个对象都能够接收信息、处理数据、向其他对象发送信息。
其他一些概念
组件:
数据和功能一起在运行着的计算机程序中形成的单元,组件是模块化和结构化的基础。
抽象性:
封装性:
每类组组件都提供了一些与其他组件进行通信的借口,并规定其调用方法
多态性:
4、什么是mvc
Mvc是一个设计模式,强调输入-处理-输出分开,应用程序被分为三个核心部件(
模型M:
表示企业数据和业务规则
视图V:
用户交互界面
处理器C:
接收用户的输入,并调用模型和视图完成用户的需求。
本身不输出任何东西和做任何处理,它只是接受请求并决定调用哪个模型部件去处理请求,然后确定用哪个视图显示模型处理后返回的数据
)
5、什么是ORM
对象-关系映射(Object/relationmap)
面向对象开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。
业务实体在内存中表现为对象,存在关联和继承关系,在数据库中表现为关系数据,无法表达关联和继承关系。
ORM实现程序对象到关系数据库数据的映射。
6、什么是CURD
创建(Create)、更新(Update)、读叏(Read)和初除(Delete)
7、什么是ACTIVERECORD
类映射到一张表,对象映射到表中的一行记录,对象属性映射到表的字段,最大程度快速实现模型操作,封装了对数据库的访问(CURD),封装了部分业务逻辑
8、什么是单一入口
一个项目有一个统一的入口文件,入口文件是第一步被执行的
规范,控制灵活
9、ThinkPHP特性
类库导入:
采用基于类库包和命名空间的形式导入类库,严格检查加载文件的大小写。
URL模式:
支持普通模式,PATHINFO模式,REWRITE模式,兼容模式等URL模式。
随心所欲构建URL地址。
编译机制:
核心编译和项目动态编译
ORM
缓存机制:
支持多种动态数据缓存类型,以及可定制的静态缓存规则
扩展机制:
支持包括类库扩展,驱动扩展,应用扩展,模型扩展,控制器扩展,标签库扩展,模板引擎扩展,widget扩展,行为扩展,模式扩展,
10、Thinkphp框架目录
ThinkPHp.php框架入口文件
Common:
框架文件,框架配置,
Lang框架语言包
Lib框架基类库
Mode框架模式扩展
Vendor:
第三方类库目录
11、thinkphp命名规范
类文件已.class.php为后缀,使用驼峰命名法,而且首字母大写
文件的命名和调用大小写要一致
函数命名要使用小写字母加下划线的方式或者驼峰法并且首字母小写
变量命名使用驼峰发且首字母小写
常量以大写字母和下划线命名
12、thinkphp的单字母函数
1、A函数实例化Action类。
A(name,app='@')
实例化Actionname表示Action名称和app表示项目名,默认是当前项目;
返回实例化后的Action对象,如果对应的Action类不存在则返回false
例子
例如我们的程序有2个Action分别是IndexAction和TestAction,在IndexAction中有个myHello方法能够输出helloworld,如果我也想在TestAction中也输出同样一段文字怎么办?
最原始的方法首先我们导入IndexAction.class.php这个文件,然后newIndexAction,最后调用myHello方法才行。
代码一般为:
PHP代码
1.
php
2.?
("@.Action.Index");
3.//导入本项目目录下Action目录下的Index.class.php文件。
4.class TestAction extends Action{
5. public function index()
6. {
7. $index=new IndexAction();//实例化IndexAction
8. echo $index->myHello();//调用myHello()方法
9. }
10.}
11.?
>
那么,如果我们用A函数,怎么写呢?
PHP代码
1.
php
2.class TestAction extends Action{
3. public function index()
4. {
5. $index=A("Index");
6. echo $index->myHello();
7. }
8.}
9.?
>
跨项目调用
$User=A("User","App2");//实例化App2项目癿UserAction控刢器对象
2、B函数执行某个行为
B(name)
调用行为name,name表示名称
例如B('app_begin');就是在项目开始之前,执行这个行为定义的所有函数,支持2个参数,第二个参数支持需要接受一个数组,例如B('app_begin',array("name"=>"tdweb","time"=>time()));这样。
3、C函数读取设置配置
C(name=null,value=null)
获取和设置配置值C('name')新增或者更新设置C('name','value')如果name的知识数组,就进行批量赋值;
获取值:
获取所有设置:
C();不传递任何参数,返回一个包含所有设置的数组。
获取指定配置:
C('URL_MODEL')这样就能得到URL_MODEL的配置信息
获取指定二维数组配置:
C("array.name"),这样就返回数组array下的key为name所对应的值
设置值:
为二维数组赋值C("array.name","value"),原理同上(获取array.name的值),后边的value是值
批量赋值:
$test=array("URL_MODEL"=>1,"THIN_MODEL"=>true");
C($test);
这样直接将数组里的值赋值了
判断是否赋值:
C("?
URL_MODEL")这样前边加个"?
",如果已经赋值,则返回true
需要说明的是,这里虽然更改了配置的值,但是仅仅是这个页面做了更改,到下个页面就不起作用了,如果想改就永久更改,那么需要配合F函数,将配置文件写入config.php才行。
也可以支持二维数组的读取和配置,使用点语法进行操作,如下:
获取已经设置的参数值:
C('USER_CONFIG.USER_TYPE')
设置新的值:
C('USER_CONFIG.USER_TYPE','1');
4、D函数实例化model
DAO函数应该是我们写程序用的最多的函数了。
和A函数类似,如果不使用D函数,就需要导入Model,然后newModel,剩下都是一样的。
但是D函数有2个有点,一是如果之前实例化过这个Model,那么就不再实例化了,剩资源;二是方便调试,如果不存在这个Model,会抛出TP异常,非常人性化。
如果访问本项目的Model直接D("Model名称");就可以了,如果打算跨项目访问,就使用D("Model名称","项目名称");如$User=D('User','Admin');$User=D('Admin.User');
5、F函数快速读取和保存文件数据
快速保存数据:
F("mydata","这里是要保存的数据"),这样就在项目Data目录下保存了一个名叫mydata.php的文件,里边的内容是该函数的第二个参数。
指定保存时间:
F("mydata","这里是要保存的数据","60"),这样,如果下次再访问,间隔大于60秒则删除次缓存文件。
指定保存目录:
F("mydata","这里是要保存的数据","60",DATA_PATH),这样就指定保存在data目录下
立即删除缓存:
F("mydata",null),第二个参数传递一个null值,这样就删除了mydate这个缓存
读取缓存数据:
F("mydata"),这样就读取这个缓存了
6、L函数
语言定义函数,L("intro")获取定义成intro的语言,l("intro","介绍")为intro赋值,关于这个赋值的长久性,道理同C函数一样,但是仅仅是这个页面做了更改,到下个页面就不起作用了。
7、R函数
还记得我们的A函数吧,如果仅仅想执行某个方法,其实用R函数更方便,刚才的可以替换成
PHP代码
1.
php
2.class TestAction extends Action{
3. public function index()
4. {
5. $index=R("Index","myHello");
6. echo $index;
7. }
8.}
9.?
>
跨项目调用
R("User","importUser","App2");//远程调用App2项目的UserAction控制器癿importUser操作方法
8、S函数
全局缓存读写函数,和C类似,不过是直接写成文件的哦,写在Temp目录下,不过在缓存有一点需要注意,如果缓存名称是aaa,那么缓存生成的文件名称就是md5("aaa")的值,值得注意。
9、U函数
U函数是很强大的一个函数,它主要是进行URL组装,同时支持不同模式和路由
例如:
取得当前模块的Action地址:
U("/nowMethod");
取得当前模块的Action地址,并传递参数:
U("/nowMethod?
params=test");
(如果不习惯上边那种方式,可以使用U("/nowMethod",array("params"=>"test");这样的数组方式传递参数,效果是一样的)
访问其他模块的方法:
U("Other/otherMethod"),这样就是访问Other模块下的otherMethod方法
跨项目访问:
U("appname:
//Other/otherMethod");
使用路由访问:
U("appName:
//routeName@moduleName/actionName?
params");
另外,如果想直接跳转,那么就在第二个参数写1,例如U("/nowMethod",1);这样就直接调转到指定URL了
13、入口文件的标准写法
定义其他配置和参数
实例化应用
载入框架入口文件
php
//定义ThinkPHP框架路徂(相对亍入口文件)
define('THINK_PATH','../ThinkPHP');
//定义项目名称和路徂
define('APP_NAME','Myapp');
define('APP_PATH','.');
//加载框架入口文件
require(THINK_PATH."/ThinkPHP.php");
//实例化一个网站应用实例
App:
:
run();
?
>
14thinkphp项目编译机制
系统第一次运行的时候会自动生成核心缓存文件~runtime.php和项目编译缓存文件~app.php,这些缓存文件把核心和项目必须的文件打包到一个文件中并且去掉所有空白和注释。
~runtime.php包含系统定义文件defines.php、系统凼数库functions.php、系统基类Think、异常基类ThinkException、日志类Log、应用类App、控刢器基类Action、规图类View
~app.php包含项目配置文件和项目公共函数文件common.php。
15、URL
1、URL访问模式
框架是基于模块和操作的方式进行访问,thinkphp支持的URL模式包括普通模式,PATHINFO模式,REWRITE模式,兼容模式,提供路由支持,默认是pathinfo模式。
普通模式(URL_MODEL为0)
http:
//localhost/appName/index.php?
m=moduleName&a=actionName&id=1
pathinfo模式(URL_MODEL为1)
http:
//localhost/appName/index.php/moduleName/actionName/id/1/
rewrite模式:
(URL_MODEL为2)
http:
//localhost/appName/moduleName/actionName/id/1/
兼容模式(URL_MODEL为3)
可以支持任何的运行环境
2、URL路由
启用路由功能需要将URL_ROUTER_ON设置为true,
开启路由功能以后如果在路由定义中找到与URL匹配的路由名称,就会进行解析和重定向。
通过routes.php(放在conf目录下,优先级较高)进行配置,
returnarray(
array('路由定义','[分组/]模块/操作名','路由对应发量','额外参数'),
)
或者在config.php中使用“URL_ROUTE_RULES”进行设置,定义形式是一样的。
'URL_ROUTE_RULES'=>array(
array('路由定丿','[分组/]模块/操作名','路由对应变量','额外参数'),
),
例子:
array('blog','Blog/archive','year,month,day','userId=1&status=1')
在执行http:
///appName/blog/2009/10/1/的时候就会实际执行blog模块下的archive方法后面的参数/2009/10/1会依次按照/year/month/day来解析并且会隐含传入userId=1和status=1两个参数,此时$_GET['year']的值为2009,$_GET['userId']的值为1。
如果需要路由到分组模块的话,可以定义成
array('blog','Home/Blog/archive','year,month,day','userId=1&status=1')
就可以指定路由到Home分组的Blog模块。
URL格式还可以使用正则表达式,例如:
'URL_ROUTE_RULES'=>array(
array('/^blog\/(\d+)$/','Blog','read','id'),
array('/^blog\/(\d+)-(\d+)/','Blog','archive','year,month'),
),
第一个路由正则表达式解析Blog/123到Blog模块癿read操作,$_GET['id']获取的值为
123
第二个路由正则表达式解析Blog/2011-5到Blog模块的archive操作,$_GET['year']
获徇2011,$_GET['month']获徇5
3、URL伪静态
系统支持url伪静态设置。
通过设置URL_HTML_SUFFIX参数随意在URL最后增加你想要的静态后缀而不影响系统正常运行。
4、URL重写
将.htacess文件放在和入口文件同级目录下面,
RewriteEngineon
RewriteCond%{REQUEST_FILENAME}!
-d
RewriteCond%{REQUEST_FILENAME}!
-f
RewriteRule^(.*)$index.php/$1[QSA,PT,L]
5、URL生成
U方法,动态的根据URL设置来生成URL地址,确保项目在移植过程中不受影响。
使用定义规则
U('[项目:
//][路由@][分组名-模块/]操作?
参数1=值1[&参数N=值N]')
或者用数组的方式传入参数
U('[项目:
//][路由@][分组名-模块/]操作',array('参数1'=>'值1'[,'参数N'=>'值N']))
不过不定义项目和模块的话就表示当前的项目和模块
U('Myapp:
//User/add')//生成Myapp项目的User模块的add操作的URL地址
U('Blog/read?
id=1')//生成Blog模块的read操作并且id为1的URL地址
U('Admin-User/select')//生成Admin分组的User模块的select操作的URL地址
参数请确保使用?
id=1&name=tp或者数组的方式来定义
在模板中的使用方法
U("News/edit/id/$vo[id]")}">阅读
比如我有一个$page=2变量怎么处理呢
U(‘Index/index?
page=’.$page)}”>
U(‘Index/index?
page=’.$vo['id'])}”>
使用路由例子
returnarray(
//常规路由
'product'=>array('Products','show','category,product_id','status=1'),
)
对应的URL访问地址例子如下:
index.php/product/5/123
U('product@?
category=3&product_id=123')}">产品详情
6、URL有空操作
如果系统找不到指定的操作方法,就会定位到空操作来执行。
我们可以实现错误页面和一些URL的优化。
7、URL有空模块
框架找不到指定的模块名称会尝试定位空模块(EmptyAction)我们可以实现错误页面和一些URL的优化。
我们要把
http:
///index.php/City/shanghai/变成http:
///index.php/shanghai/
ClassEmptyActionextendsAction{
Publicfunctionindex(){
//根据当前模块名称来判断要执行哪个城市的操作
$cityName=MODULE_NAME;
$this->city($cityName);
}
Protectedfunctioncity($name){
//和$name返个城市相关癿处理
echo('当前城市:
'.$name);
}
}
16、类库介绍与导入方法
1、框架类库
基类库位于框架的lib目录下面,框架内置有Think核心类库和扩展类库ORG(第三方公共类库),Com(企业基类库)等,所有扩展类库必须放在这两个类库包下管理。
2、应用类库
Import方法是tp提供的类库和文件的导入方法,具有缓存和检测机制,相同文件不会重复导入,注意区分大小写。
系统会自动识别导入类库文件的位置,thinkphp约定的是Think,ORG,Com包的导入以系统基类库为相对起始目录(即/Thinkphp/Lib),
import("Think.Util.Session");
import("ORG.Util.Page");
上面两个方法分别导入了系统目录下癿Thinkphp/Lib/Think/Util/Session.class.php和
Thinkphp/Lib/ORG/Util/Page.class.php类文件。
否则就是以项目应用类库为起始目录()
import("MyApp.Action.UserAction");
import("MyApp.Model.InfoModel");
上面的方式表示分别导入MyApp项目下面的Lib/Action/UserAction.class.php和Lib/Model/InfoModel.class.php类文件。
通常我们都是在当前项目里面导入所需的类库文件我们可以使用下面的方式来简化代码
import("@.Action.UserAction");
import("@.Model.InfoModel");
如果要在当前项目下面导入其他项目的类库,必须保证两个项目的目录是平级的,否则无法使用
import("OtherApp.Model.GroupModel");
其它情况的导入,需要拟定baseUrl参数,也就是import方法的第二个参数。
例如,要导入当前文件所在目录下面的RBAC/AccessDecisionManager.class.php文件,可以使用:
import("RBAC.AccessDecisionManager",dirname(__FILE__));
3、第三方类库
统一放在Vendor文件夹下面,并使用vendor方法导入,默认以php作为后缀名。
例如,我们把Zend的Filter\Dir.php放到Vendor目录下面,此时dir路径就是
Vendor\Zend\Filter\Dir.php,我们使用vendor方法导入叧需要使用:
Vendor('Zend.Filter.Dir');
4别名导入
预先定义好相关类库的路径,在需要的时候根据定义的别名进行快速导入。
可以统一用import进行别名导入。
框架默认的别名导入文件位于Common\alias.php,例如
import('AdvModel');
如果有定义AdvModel别名,则import方法会自动加载定义的别名。
别名定义:
'Model'=>THINK_PATH.'/Lib/Think/Core/Model.class.php',
'Dispatcher'=>THINK_PATH.'/Lib/Think/Util/Dispatcher.class.php',
'HtmlCache'=>THINK_PATH.'/Lib/Think/Util/HtmlCache.class.php',
5、自动加载