Thinkphp各个版本总结:tp3.2.3,tp5.0,tp5.1差别php
终得闲暇时间(也就两三个小时)可以进行这6个月对tp框架的使用总结了:css
1.框架隐藏模块差别:laravel
tp3.2.3:其实还比较麻烦web
//隐藏入口文件 在与入口文件同级目录,将.htaccess文件中 RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] 修改成 RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L] //配置设置默认模块访问模块 ‘DEFAULT_MODULE’=> 'Home'(Home为模块名称), //隐藏模块,关闭多模块访问 ‘MULTI_MODULE’=> false, //改变URL模式为重写模式 'URL_MODEL' => 2, (注意要隐藏哪一个模块在哪一个模块下的配置文件下配置,不然关闭多模块访问会出现其余模块不能被访问) //在公共的配置文件配置,多模块访问 'MODULE_ALLOW_LIST' => array( '模块名称1','模块名称2','模块名称3'),
tp5:能够看见其中稳了隐藏url中的模块名咱们须要进行设置的是一个BIND_MOULE常量thinkphp
define('APP_PATH', __DIR__ . '/../application/'); define('BIND_MODULE','home'); // define('CONTROLLER_NAME',\think\Request::instance()->controller()); // 加载框架引导文件 require __DIR__ . '/../thinkphp/start.php';
tp5.1:隐藏模块名所须要的是利用Container中的链式方法进行bind方法中的绑定模块数据库
namespace think; // 加载基础文件 require __DIR__ . '/../thinkphp/base.php'; // 支持事先使用静态方法设置Request对象和Config对象 // 执行应用并响应(5.1在此用bind实现隐藏模块名) Container::get('app')->bind('index')->run()->send();
2.模板主题的设置json
思路是说手机端和电脑端在base的控制器中区别以后改变配置的模板路径浏览器
tp3.2.3(极为简单):此刻你的$this->display();路径就是对应的moule/view/m/ 下的路径了缓存
if (is_mobile()) { //设置默认主题为 m C('DEFAULT_THEME','m'); }
tp5及以上:模板主题的思路是自动适配view的路径php框架
//模板主题的切换(适配各个平台以及双端) $theme = Env::get('module_path').'view/'.(get_platform()).'/'.(is_mobile()?'m/':'web/'); $this->view->config('view_path',$theme);
3.助手函数的升级(字母函数的升级)
tp3.2.3:很明显你们都知道有所谓的字母函数能够进行使用,可是其实好用归好用,违反了许多代码的规范和习惯
tp5以上因为我公司统一优先级是助手函数优先因此我也发掘了一些助手函数的差别:
3.2 版本 |
5.0 版本 |
---|---|
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 | 废除 |
tp5.1以上:
助手函数 描述 abort 中断执行并发送HTTP状态码 action 调用控制器类的操做 app 快速获取容器中的实例 支持依赖注入 behavior 执行某个行为 bind 快速绑定对象实例 cache 缓存管理 call 调用反射执行callable 支持依赖注入 class_basename 获取类名(不包含命名空间) class_uses_recursive 获取一个类里全部用到的trait config 获取和设置配置参数 container 获取容器对象实例 controller 实例化控制器 cookie Cookie管理 db 实例化数据库类 debug 调试时间和内存占用 dump 浏览器友好的变量输出 env 获取环境变量(V5.1.3+) exception 抛出异常处理 halt 变量调试输出并中断执行 input 获取输入数据 支持默认值和过滤 json JSON数据输出 jsonp JSONP数据输出 lang 获取语言变量值 model 实例化Model parse_name 字符串命名风格转换 redirect 重定向输出 request 实例化Request对象 response 实例化Response对象 route 注册路由规则(V5.1.3+) session Session管理 token 生成表单令牌输出 trace 记录日志信息 trait_uses_recursive 获取一个trait里全部引用到的trait url Url生成 validate 实例化验证器 view 渲染模板输出 widget 渲染输出Widget xml XML数据输出
其中要重点说的是request()这个助手函数!:
tp3.2.3的CONTROLLER_NAME和ACTION_NAME在tp5以上都已经进行了废除 tp5以上的获取方法: requset()->controller(); request()->action(); 固然别忘了在模板里面要 {:requset()->controller()} {:requset()->action()} 固然还有的就是Request类的use: tp5.0版本: use think\Request; tp5.1版本: use think\facade\Env; 而后就是 Request::isAjax() Request::isGet() Request::isPost()... 助手函数: request()->isGet() request()->isPost() request()->isAjax()
其中不少tp5.0只要use以后就能使用的类静态调用方式在tp5.1你发现不行
此时你须要查看手册中这个类是否是有facade,有得话就在think\后加上facade\,有的话你就加上去吧。
其中5.1某些版本中$_SERVER这类变量没法使用:此时就须要use think\facade\Request;就可以恢复使用。
4.目录结构得变化
tp3.2.3入口直接就在根目录当中,而tp5以上都在public这个文件夹当中
配置文件tp3.2.3分得不是那么详细:分为Common中的主配之以及各个模块中的分配置,配置冲突时分配置优先级高!
tp5.0:
tp5.1更为细化的配置:
配置当中5以后被分为各类配置不像3.2.3在同一个config.php文件当中。如今区分为app,cache,databases,template(模板)这几个配置;
不一样于3.2.3当中的__PUBLIC__这些都被取消了,可是咱们能够在配置template文件中进行设置: // 视图输出字符串内容替换 'tpl_replace_string' => [ '__STATIC__'=>'/static/common/js', //或者 // '__ADDONS__' =>'/static/'.(get_platform()).'/index/Addons', '__IMG__' =>'/static/'.(get_platform()).'_'.(is_mobile()?'m':'pc').'/images', '__CSS__' =>'/static/'.(get_platform()).'_'.(is_mobile()?'m':'pc').'/css', '__JS__' =>'/static/'.(get_platform()).'_'.(is_mobile()?'m':'pc').'/js', '__ROOT__'=> '', '__UPLOADS__' => '/uploads', '__PUBLIC__' => '/static/'.(get_platform()).'_'.(is_mobile()?'m':'pc'), ],
5.模板差别
a.标签开头和结尾<和>改成{和}后会有很大的问题存在,问题在于{}咱们也用来了调用助手函数以及输出一些变量数据等。例如一下的冲突状况:
{include file="Public/header" title="{$appInfo.title}_{:config('WEB_SITE_TITLE')}" description="{$appInfo.description}" keywords="{$appInfo.keywords}" cate="哈哈"/} 其中模板规定了助手函数使用: {:助手函数()} 可是咱们的include内置标签的'{'会去找他最近的一个'}',他找到的是config这个助手函数的 "}"因此从description开始以后所有变为标签外的数据。 一般解决办法就是将助手函数的使用放置于C层当中,而后传变量进来。 包含文件以后能够经过以上的方式进行注入参数,而后被包含的文件就能够是这样子的: <meta name="keywords" content="[keywords]"> <meta name="description" content="[description]">
b.tp5.1以后的 if标签和foreach标签产生了改变
tp3.2.3以及tp5.0(依旧使用尖括号讲解) <if condition="$times eq 1"> <foreach name='nav2' item='v'> tp5.1:纯原生 <if (!empty($tempType)) && $tempType == "index" > <foreach $ziwei['data'] as $k=>$v>
c.视图渲染
tp3.2.3:$this->display();这个相信你们都会用 tp5.0以上: 1.return $this->fetch(); 2.助手函数view的使用: return view('hello', ['name' => 'thinkphp']);
d.
6.开发规范(报找不到控制器,找不到方法之类的错误,其实官方手册已经足够详细了,但愿开发以前首先拜读一番!)
目录和文件 目录使用小写+下划线; 类库、函数文件统一以.php为后缀; 类的文件名均以命名空间定义,而且命名空间的路径和类库文件所在路径一致; 类文件采用驼峰法命名(首字母大写),其它文件采用小写+下划线命名; 类名和类文件名保持一致,统一采用驼峰法命名(首字母大写); 函数和类、属性命名 类的命名采用驼峰法(首字母大写),例如 User、UserType,默认不须要添加后缀,例如UserController应该直接命名为User; 函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip; 方法的命名使用驼峰法(首字母小写),例如 getUserName; 属性的命名使用驼峰法(首字母小写),例如 tableName、instance; 特例:以双下划线__打头的函数或方法做为魔术方法,例如 __call 和 __autoload;
7.自定义的类库vendor(类库载入)
tp3.2.3的路径是/ThinkPHP/Library/Vendor;而后引用的时候是直接采用助手函数vendor()进行使用
vendor('xunsearch.lib.XS'); $xs = new \XS('art');
tp5.0使用的是/vendor路径,可是采用的是import进行载入使用(我真的喜欢这种方法):
Loader::import('first.second.Foo'); $foo = new \Foo();
tp5.1使用的是/vendor路径,可是废除了import这一个神器,直接就是只能required去包含这个文件:
一般配合着env('vendor_path')去获取路径进行包含
use think\facade\Env; // 设置支付请求订单参数 require_once(Env::get('extend_path') . 'linxun/paychannel/Alipay/wappay/buildermodel/AlipayTradeWapPayContentBuilder.php'); $payRequestBuilder = new \AlipayTradeWapPayContentBuilder(); 固然能够采用助手函数env()
8.W函数 / widget函数的妙用
这个函数实际上是一个很是好用的小玩意儿,他能够在任何地方让你去调用相关逻辑层的东西,讲俗一点一个随时能够调用的C层同样的东西。
首先咱们定义它:
namespace app\index\widget; use think\Action; use think\Controller; /** * 分类widget * 用于动态调用分类信息 */ class Applist extends Controller { /* 显示指定分类的同级分类或子分类列表 */ public function lists($groupid=0,$limit=10) { $apps = db('appinfo')->where('groupid',$groupid)->limit($limit)->select(); $this->assign('apps', $apps); return $this->fetch('List/subnav'); } }
其次咱们在模板中调用它
<div class="subnav"> <ul> {:widget('Applist/lists', ['groupid'=>$appInfo['groupid'],'limit'=>30])} </ul> </div>
这样咱们甚至能够将Applist类中lists方法渲染的视图直接抽取过来。
9.composer
对于不了解composer的必定最好使用tp框架的同时必定要学会使用composer进行类库的加载,博主的另一票composer的打包可让你彻底走入composer的世界:
Composer包制做以及发布!连接以下:
https://blog.csdn.net/HoeWang/article/details/82421061
10.总结
tp的各个版本差别仍是有不少,可是其余的都大部分手册一查就可以完美解决了。对于tp框架呢,官方的谩骂也有,可是通过了长时间的使用,我发现其实做为一个轻量级别的框架,尤为5.0以后打的接口话的架构其实thinkphp框架仍是很是不错的。可是也见的有人无脑喷,tp自己轻量级且快于laravel,对于国内的开发者能够说是最为友好都没有之一的php开发框架了。总体来讲对我来讲算是一把不算神兵利器的惯手中等武器吧。其余tp的底层我也改过,特别好改,且不容易形成灵异冲突,因此对于初中级的php这算是一门必须的php框架吧!