hoewang

Thinkphp各个版本总结:tp3.2.3,tp5.0,tp5.1差异

终得闲暇时间(也就两三个小时)能够进行这6个月对tp框架的使用总结了:

1.框架隐藏模块差异:

tp3.2.3:其实还比较麻烦

//隐藏入口文件

在与入口文件同级目录,将.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常量

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.模板主题的设置

思路是说手机端和电脑端在base的控制器中区别之后改变配置的模板路径

tp3.2.3(极为简单):此刻你的$this->display();路径就是对应的moule/view/m/   下的路径了

if (is_mobile()) {
   //设置默认主题为 m
   C(\'DEFAULT_THEME\',\'m\');
}

tp5及以上:模板主题的思路是自动适配view的路径

//模板主题的切换(适配各个平台以及双端)    
        $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框架吧!

分类:

技术点:

相关文章: