了解ThinkPHP
简介
ThinkPHP 是国内著名的 php开发框架,基于MVC模式,最早诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP。
本文主要对ThinkPHP v3的程序代码结构和一些封装操作进行分析
ThinkPHP v3.x 系列最早发布于2012年,于2018年停止维护,其中使用最多的是在2014年发布的3.2.3。基于ThinkPHP 3.2.3的魔改项目也很多,但是万变不离其宗,我们从ThinkPHP学习如何审计这一类MVC模式的程序代码
关于MVC
MVC全称是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,MVC模式强制性地使应用程序的输入、处理和输出分开。 使用MVC应用程序被分成三个核心部件:模型、视图、控制器。 它们各自处理自己的任务
安装环境
下载源码:https://github.com/top-think/thinkphp/archive/3.2.3.zip
放置在www目录下
目录结构如下
需要注意的是,这个时期的默认目录结构是存在问题的,比如能够直接访问Application/Runtime/Logs/
下的日志
修改\ThinkPHP\Conf\convention.php
配置文件中的数据库配置如下:
/* 数据库设置 */
'DB_TYPE' => 'mysql', // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'thinkphp3', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => 'root', // 密码
'DB_PORT' => '3306', // 端口
'DB_PREFIX' => 'tp3_', // 数据库表前缀
'DB_PARAMS' => array(), // 数据库连接参数
'DB_DEBUG' => true, // 数据库调试模式 开启后可以记录SQL日志
'DB_FIELDS_CACHE' => true, // 启用字段缓存
'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8
'DB_DEPLOY_TYPE' => 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'DB_RW_SEPARATE' => false, // 数据库读写是否分离 主从式有效
'DB_MASTER_NUM' => 1, // 读写分离后 主服务器数量
'DB_SLAVE_NO' => '', // 指定从服务器序号
数据库中创建相应的数据库和表数据
控制器负责生成对浏览器请求的响应,配置控制器Application/Home/Controller/IndexController.class.php
public function index(){
$data = M('users')->find(I('GET.id'));
var_dump($data);
}
在ThinkPHP中,存在多个配置文件,其加载顺序为:
惯例配置->应用配置->模式配置->调试配置->状态配置->模块配置->扩展配置->动态配置
当然,后面加载的配置会覆盖前面的配置
我们刚才修改的convention.php
就是框架内置的惯例配置文件
路由格式
TP3版本的路由格式:
http://php.local/thinkphp3.2.3/index.php/Home/Index/index/id/1
模块/控制器/方法/参数
也可以用
http://php.local/thinkphp3.2.3/index.php?s=Home/Index/index/id/1
快捷方法
在web应用中有一些操作是我们经常会做的,比如说获取用户的GET或者POST输入,又或者说进行一个数据库查询,这些操作频繁且容易出错,所以TP3对这些经常使用的操作封装成了快捷方法,一方面让程序更加安全,一方面减少冗余代码。
I方法
I方法是TP3众多单字母函数中的新成员,是input的简写,主要用于更加方便和安全的获取系统输入变量,可以用于任何地方,用法格式如下:
I('变量类型.变量名',['默认值'],['过滤方法'])
示例:
- echo I('get.id'); // 相当于 $_GET['id']
- echo I('get.name'); // 相当于 $_GET['name']
- echo I('get.id',0); // 如果不存在$_GET['id'] 则返回0
- echo I('get.name','','htmlspecialchars'); // 采用htmlspecialchars方法对name进行过滤
POST输入也同理,当我们没有指定过滤方法的时候,系统会采用默认的过滤机制,即htmlspecialchars
,这个过滤主要是防止XSS攻击的
M/D方法
用于数据模型的实例化操作,我们只需要知道通过这两个快捷方法能够快速实例化一个数据模型对象,从而操作数据库
示例:
- $user = new UserModel(); 等价于 $user = D('user');
- $Demo = new Model('User'); 等价于 $Demo = M('User');
C方法
读取配置文件里的数据
示例:
- $model = C('URL_MODEL');
U方法
U方法用于完成对URL地址的组装,其特点在于可以自动根据当前的URL模式和设置生成对应的URL地址,格式为:
U('地址','参数','伪静态','是否跳转','显示域名');
示例:
- U('User/add') // 生成User模块的add操作地址
- U('Blog/read?id=1') // 生成Blog模块的read操作 并且id为1的URL地址
- U('Blog/read?id=1') // 生成Blog模块的read操作 并且id为1的URL地址