ThinkPHP
一、什么框架:
一堆代码的集合,里边有变量、函数、类、常量,里边也有许多设计模式MVC、AR数据库、单例等等。
框架可以节省我们50-60%的工作量,我们全部精力都集中在业务层次。
二、PHP开发存在的问题:
1. 多人开发项目,分工不合理,(html php mysql)
2. 代码风格不一样,后期维护十分困难
3. 项目生命周期十分短,项目生命没有延续性,造成资源浪费、人员浪费
4. 项目不能很好适应客户需求,牵一发而动全身。
三、为什么使用框架
框架可以帮组我们快速、稳定、高效搭建程序系统
该系统由于框架的使用使得本身的维护性、灵活性、适应客户需求方面得到最大化的增强。
使用框架的过程中可以使得我们的注意力全部集中业务层面,而无需关心程序的底层架构。
四、相关框架
1. zendframework zend php语言公司发布的官方框架,重量级(功能多)
2. yii 美国华人开发的框架,xue qiang, qiang, 重量级框架,纯OOP框架
3. CI CodeIgniter 轻量级框架,开发速度快,部署灵活
4.cakephp 外国框架,重量级,速度慢
5.symfony 外国重量级框架
6.ThinkPHP 轻量级框架,国人框架,入门容易
【使用框架】
现在已经更新到5.0版本 不过我们现在学习的是3.2版本
Think PHP 3.2 版本 下载下来 解压之后
【MVC模式】
M:Model 数据模型层,负责数据操作 例如 之前写的 DBDA类 就相当于一个数据模型层 和数据库进行一些相关操作
V:View 视图层,负责显示视图 相当于模板
C:Controller 控制器,实现业务逻辑 业务逻辑层 核心
如果你的程序使用了MVC 模式 有一句话一定要记住 “约定胜于配置!!!”
如果使用了MVC 模式 里面有很多约定 非强制性 但是一定要遵循这些约定 不然会出问题 只有遵循这些约定 才不用去修改一些单独的配置 所以尽量按照约定来写
举一个约定的例子:
约定里面有一个驼峰法 针对文件的命名
比如类文件 在MVC 模式里面必须用驼峰法写 : RenMin 首字母大写 类文件后面必须加.class.php 也就是类文件命名必须这样写 RenMin.class.php
还有类文件class前面的名字必须跟类名一样 你写了一个RenMin 的 类 文件的命名也必须是 RenMin ,也就是类文件命名必须这样写 RenMin.class.php
文件夹的命名也是一种约定 不能随意改换。必须是这样
【框架项目部署】
创建入口文件:
- 在ThinkPHP目录下创建一个入口文件index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- // 应用入口文件 // 检测PHP环境 if (version_compare(PHP_VERSION, '5.3.0' , '<' )) die ( 'require PHP > 5.3.0 !' ); // 开启调试模式 建议开发阶段开启 部署阶段注释或者设为 false 生产模式 define( 'APP_DEBUG' ,True); //开发调试模式// 定义应用目录 define( 'APP_PATH' , './Shop/' ); //更改shop访问入口文件 系统会自动创建对应的应用目录文件 // 引入ThinkPHP入口文件 核心操作 require './ThinkPHP/ThinkPHP.php' ; // 亲^_^ 后面不需要任何代码了 就是如此简单 |
2、访问入口文件的同时系统会自动把对应的应用目录文件创建出来
3、打开Home文件夹
如图所示 上图 也有配置文件 Conf 这是Home文件夹里的配置文件 有些程序需要修改配置文件 要修改自带的 Conf 不要动 TP框架里的Conf 一旦动了 用这个框架的所有程序都会出现改变 切记切记!
如果你不想使用Home模块 可以自定义一个其他名字的模块 比如:Admin
但是 如果想让Admin像Home般 正常使用,就要在Admin下建好相应的文件夹 文件夹名字必须是这样 不能随意更换。
然后需要在controller文件夹里面写控制器,控制器文件的命名必须使用驼峰法再加上控制器,比如我新建了一个名字叫login 的控制器,名字必须是 LoginController.class.php
控制器内的写法为:
1 2 3 4 5 6 7 8 9 10 11 12 | <?php //命名空间 相当于虚拟目录 注意命名空间里面用的是反斜杠 Admin 模块名 namespace Admin\Controller; use Think\Controller; //也是命名空间 use 继承父类控制器 class LoginController extends Controller { //定义类 类名 extends 继承 父类控制器 //写操作方法 访问时 访问的是控制器里面的操作方法 public function index(){ //操作方法 首字母小写 但如果有第二个字母需要大写 注意书写规范 echo "这是Admin下的登录控制器" ; } } |
访问成功
一个控制器内有多个操作方法 一个操作方法对应一个模板文件 其他控制器中也可能出现这个操作方法对应这个模板文件 所以 在 View 文件夹下建模板文件是 需要先建一个对应控制器的文件夹 以免出错 比如写 LoginController.class.php控制器的模板文件 需要先在View 文件夹下 建一个Login文件夹,在Login文件夹下写对应方法的模板文件 ,index方法 对应 index.html模板文件。
index.html模板文件内的写法:
在LoginController.class.php控制器 index方法 里面调用: 或
访问显示:
注册变量:
首先 在控制器里面 调用assign()方法,里面写变量
在index.html里面调用test 首先需要知道 分隔符是什么 所以打开父类conf文件夹下的convention.php文件 找到
'TMPL_L_DELIM' => '{', // 模板引擎普通标签开始标记
'TMPL_R_DELIM' => '}', // 模板引擎普通标签结束标记
复制粘贴 拿到本模块 conf文件夹下config.php文件内 也可以进行修改 我在这里修改成了
在index.html里面调用test
访问
在index.PHP里面嵌入form表单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <!-- <form action= " http://localhost/TP/index.php/Admin/Login/chuli" method= "post" > --> <form action= "__CONTROLLER__/chuli" method= "post" > <!--表示找当前控制器下chuli操作方法--> <!--action 之前指向页面 因为 现在是 MVC模式 它 应该指向控制器的操作方法 浏览器访问页面的地址 地址 太长 可以简化一下 需要获取一下系统常量--> <input type= "submit" value= "提交" /> <!--点击提交转入处理页面--> </form> <!-- action 和 self 的区别 action:特指当前操作方法的路径 self:指浏览器中有什么他就有什么 如果操作方法有get传值 action只能取到操作方法 而 self 能全部取到包括操作方法后get传的值 _APP_:程序目录 _SELF_:代表自身 __MODULE_:代表模块 例如:Home、Admin _CONTROLLER_:代表找到控制器 _ACTION_:找到操作方法 --> |
点击提交
转到处理页面
【控制器访问及路由解析】
在浏览器中访问操作方法 可以有一下四种方式
通过url地址get参数找到指定的控制器,并进行对应方法调用请求
http://网址/index.php?m=模块名称&c=控制器&a=方法
以上url地址信息代码不够优雅、不安全。
tp框架url地址可以由以下四种
- http://网址/index.php?m=XX&c=XX&a=XX 基本get模式
- http://网址/index.php/模块/控制器/操作方法 路径模式pathinfo 最常用
- http://网址/模块/控制器/操作方法 rewrite重写模式
- http://网址/index.php?s=/模块/控制器/方法 兼容模式
这四种方式可以通过修改配置文件 来修改URL的模式
打开之前建的 Home文件夹 里面的的 Conf配置文件
打开config.php 文件 index.html文件没什么用 可以直接删掉
打开之后的样子 可以在这里面写配置
可是要写什么配置呢?
我们可以找到TP 框架里的 conf文件夹 打开convention.php文件
找到URL_MODEL 复制 放到config.php 里面修改 不要动 convention.php里面的内容
将它复制到config.php里面修改,0为普通模式 也就是get模式 , 1为PATHINFO 模式 也就是 最常用的 路径模式, 2 REWRITE 模式 也就是 重写模式 3 兼容模式
默认为路径模式模式。//无论这里修改成0 1 2 3 中的任意一个数组 在浏览器访问时其他三种方式依然可以使用 此处修改 非是针对于访问而是针对于生成。
如果想生成UL地址的话 可以使用U()方法 在IndexController.class.php里面作如下修改:
不做修改时默认为1,1生成的UL地址是:
接下来我们将1改成0 来看一下生成的UL地址:
将0改成2 生成的UL地址是:
将2改成3 生成的UL地址是:
生成UL地址的作用:跳转页面 生成一个地址跳转 要用到UL地址时可以自动生成一个
U()里面写index 生成的地址是当前模块 当前控制器下index操作方法 在这里就是 Home模块下 Index控制器下 index操作方法
如果要生成其他控制器比如Login控制器下的操作方法的地址 需要在U()方法里面 加上Login(控制器名) 然后/ 如下图所示 生成的就是 Home模块下 Login控制器下 index操作方法的UL地址
如果模块也不一样 就在控制器前再加模块名和/ 如下图:
参数不同 创建的访问路径也会不同。
快捷方法:
TP里面快捷方法比较多 U()方法是其中一个 用来创建UL地址 还有其他快捷方法 比如:
U() 制作url地址的快捷函数
C(名称) 获得配置变量(convertion.php config.php)信息
C(名称,值) 设置配置变量信息
L() 获得语言变量信息
E() 给页面输出错误信息
A("项目://模块/控制器") 实例化控制器对象
A("Home/User") 实例化User控制器对象
A("book://Home/User") 实例化book项目的Home模块的User控制器对象
R("Home(模块)/Main(控制器)/mceshi(操作方法)"); 调方法
【url地址大小写设置】
默认是不敏感的:
在config.php里边对url大小写敏感进行设置
显示tract信息:
需要在配置(config.php)里面加上一句话('SHOW_PAGE_TRACE'=>true,),如图所示:
再次访问时,浏览器右下角会多一个图标:
点开之后会:
显示一些信息 在开发时 尽量打出来 便于查错 开发完毕 可以关掉。
【空操作和空控制器处理】
空操作:就没有指定的操作方法
空控制器:没有指定控制器
前面提到过在网页中访问 最常用的是http://网址/index.php/模块/控制器/操作方法 路径模式 ,如果我们访问了不存在的操作方法或者不小心打错了字母 会出现
处于安全考虑 最好不要给用户提示任何错误信息,如上图所示 ,既降低了用户体验又增加了安全隐患,所以我们现在需要一个方法把这些都隐藏掉,在父类里面有一个__call (); 方法。
首先 上图 第二条 检查是否存在默认模版 如果有直接输出模版,上面的非法操作一图,我原本想要访问的是chuli操作方法,可是我只打到了chu就进行了访问,如果现在 在 view文件夹中有一个名字叫chu的模板的话就会直接输出了,如下图:
访问chu
这样就避免了信息的泄露,可是下次访问我如果打成chul 还是显示 非法操作的图 ,想要用这种办法完全杜绝是非常麻烦而又不现实的,所以我们再看第一条:如果定义了_empty操作 则调用,我们在控制器里定义一个_empty
在浏览器中随意访问不在的操作方法:
这样就好了,我们再来看控制器:
访问一个不存在的控制器:
与空操作一样 在父类中有一个
里面有
所以 我们制作一个EmptyController.class.php控制器就好了
里面这样写
再次访问:
在同一控制器下调用其他方法:
首先,我们在Login控制器下作两个方法:
用$this->ceshi();调用 访问caozuo();
【跨控制器调用】
一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法。
跨控制器调用可以节省我们代码的工作量,比如有个操作方法需要重复使用,直接调用就可以,不用重复书写。
在Main控制器中有一个mceshi()操作方法
在Login控制器中通过caozuo()方法来调用,有两个方法
其一: echo不写也可以
其二:通过快捷方法A()来调用
显示:
【跨模块调用】
首先在Home模块Main控制器下写操作方法
然后在Admin模块Login控制器下调用 我们有以下三种方法
其一:造对象
其二:A()方法
其三:R()方法
A() 方法 和 R()方法 的区别:
A():造对象调用 可操作对象
R():直接调用方法,比较方便,不可操作
在浏览器中访问
【命名空间】
相当于虚拟目录
实现自动加载类的机制
初始命名空间:ThinkPHP\Library 相当于根 (最底层)
初始命名空间有很多根命名空间(相当于根路径下有很多文件夹):
只有下面两个地方可以存放类
1.Library里面的文件夹
2.APP(应用程序)的模块文件夹 比如:Home,Admin
在定义的时候:在写命名空间的时候需要从根写起,写到该文件所在的文件夹结束,
用的时候:use在写命名空间的时候需要从根写起,写到该文件名(类名)结束
命名空间用\反斜杠
【模型层】
【连接数据库配置及Model数据模型层】
convertion.php
config.php
- 在config.php做数据库连接配置
未完待续。。。。。。。。。
发表评论 取消回复