thinkPHP3.x - thinkPHP5.x 区别记录( 踩坑 整理 收集 等 … )
绪:
我是一个3.x的使用者,最近才接触5.x(挺晚了),改动很大,在我使用的新的的过程中肯定会遇到各种各样的问题,因此想着用一篇文章记录一下,一是到时候自己遇到了比较好找问题或处理,不用再二次费力;二是给同样有需要的人使用;三是希望自己学到更多吧。我会慢慢收集我所遇到的,大家有新增加的可以在评论区加等。总之怎么舒服怎么来。
我看的几篇有帮助的文章:
http://www.thinkphp.cn/topic/64201.html(TP3.2系统升级到5.1的教程)
https://www.kancloud.cn/manual/thinkphp5/118003(5.0开发手册)
1.入口文件
3.x的入口文件时index.php,但是在5.x里就没有这个文件了,我第一次看到的时候还有点迷,其实5.x的真正的路口文件是在public里,使用5.x的第一步就是修改入口文件,方式有两种:
①在根目录种新建一个index.php文件,内容:<?php require('public/index.php'); ?>
②删除public/index.php这个文件,然后根目录下新建一个index.php,内容是:
<?php
//应用目录
define('APP_PATH',__DIR__.'/apps/');
//加载框架引导文件
require './thinkphp/start.php';
?>
来源:https://tieba.baidu.com/p/5215297961
2.debug功能
3.x的debug默认打开,但是5.x的debug默认关闭,打开的方式是修改配置文件:
'app_debug' => true,//启动应用调试模式
'show_error_msg' => true,//启动显示错误信息
来源:https://tieba.baidu.com/p/5215297961
3.URL变动
在5.0版本正式废除类似/id/1方式 可以通过get获取到id的方法,严格来讲这样的url是不属于$_GET的,现在可以通过param获取,具体使用可以通过请求部分查询。
来源:https://www.kancloud.cn/manual/thinkphp5/163239#V32V50_204
4.命名规范
- 目录和文件名采用‘小写+下划线’,并且以小写字母开头;
- 类库、函数文件统一以.php为后缀;
- 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致(包括大小写);
- 类名和类文件名保持一致,并统一采用驼峰法命名(首字母大写)
来源:https://www.kancloud.cn/manual/thinkphp5/163239#V32V50_204
5.控制器
- 控制器的命名空间有所调整,并且可以无需继承任何的控制器类。
- 应用类库的命名空间统一为app(可修改)而不是模块名;
- 控制器的类名默认不带Controller后缀,可以配置开启controller_suffix参数启用控制器类后缀;
- 控制器操作方法采用return方式返回数据,而非直接输出;
- 废除原来的操作前后置方法;
版本对比
3.2版本控制器写法
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller
{
public function hello()
{
echo 'hello,thinkphp!';
}
}
5.0版本控制器写法
namespace app\index\controller;
class Index
{
public function index()
{
return 'hello,thinkphp!';
}
}
3.2版本控制器命名
IndexController.class.php
5.0版本控制器命名
Index.php
怎么才能在控制器中正确的输出模板
5.0在控制器中输出模板,使用方法如下:
如果你继承think\Controller的话,可以使用:
return $this->fetch('index/hello');
如果你的控制器没有继承 think\Controller的话,使用:
return view('index/hello');
来源:https://www.kancloud.cn/manual/thinkphp5/163239#V32V50_204
6.助手函数
部分对比:
3.x版本 | 5.x版本 |
---|---|
C | config |
E | exception |
G | debug |
L | lang |
T | 废除 |
I | input |
N | 废除 |
D | model |
M | db |
A | controller |
R | action |
B | 废除 |
U | url |
W | widget |
S | cache |
F | 废除 |
来源:https://www.kancloud.cn/manual/thinkphp5/163239#V32V50_204
7.废除的系统常量
REQUEST_METHOD IS_GET IS_POST IS_PUT IS_DELETE IS_AJAX __EXT__ COMMON_MODULE MODULE_NAME CONTROLLER_NAME ACTION_NAME APP_NAMESPACE APP_DEBUG MODULE_PATH等
IS_POST 替换为:request()->isPost()
IS_GET 替换为:request()->isGet()
IS_AJAX 替换为:request()->isAjax()
…
来源:https://www.kancloud.cn/manual/thinkphp5/163239#V32V50_204
8.模型
新版的模型查询增加了静态方法,例如:
User::get(1);
User::all();
User::where('id','>',10)->find();
新版的模型查询返回默认对象,系统默认增加了toArray方法,许多开发者在all或select尝试使用toArray来转换为数组,在此希望开发者能理解对象的概念,尝试使用对象进行数据的使用,或者使用db方法进行数据库的操作,也提醒一下部分滥用toArray的开发者,all或select结果是对象的数组集合,是无法使用toArray进行转换的。(原本例如find等方法返回的是数组,如今变为了对象,使用toArray方法可以转换)。
来源:https://www.kancloud.cn/manual/thinkphp5/163239#V32V50_204
9.数据库相关
原先需要通过模型才能使用的链式查询可以直接通过Db类调用,原来的M函数调用可以改用db函数,例如:
3.2版本
M('User')->where(['name'=>'thinkphp'])->find();
5.0版本
db('User')->where('name','thinkphp')->find();
在TP3.2的模型中,create方法但创建数据对象 但不保存到数据库;在TP5中,create方法是创建并写入数据库,并返回数据实例。
来源:
https://www.kancloud.cn/manual/thinkphp5/163239#V32V50_204
http://www.thinkphp.cn/topic/64201.html
10.前端相关
模板标签规则:
// 标签库标签开始标记
‘taglib_begin’ => ‘<’,
// 标签库标签结束标记
‘taglib_end’ => ‘>’,
变为:
// 标签库标签开始标记
‘taglib_begin’ => ‘{’,
// 标签库标签结束标记
‘taglib_end’ => ‘}’,
包含js,css,图片文件直接写Public下的路径就可以了,不用再使用PUBLIC了
控制器里边忘了一点,__SELF__改为用requet()了
前端能用的公共函数原来放在ThinkPHP/Common/functions,现在放在thinkphp/helpe
来源:
http://www.thinkphp.cn/topic/64201.html
https://tieba.baidu.com/p/5215297961