从thinkphp 5.0升级到5.1的18个理由

ThinkPHP5.1从2018年初发布到现在,一路小步快跑,快速迭代的同时也更新了大量的新特性。

那么到底是否值得升级到新版呢?如果你还在纠结选用5.0的商城系统还是选用thinkphp 5.1的系统,本文就和大家分享下值得升级到5.1的18个理由。

  • 1、快速启动测试服务器:直接跨过门槛学框架
    2、对象容器引入和依赖注入改进:实用高逼格
    3、增加门面对象:类的小助理
    4、路由更对象化:又双叒叕提速?
    5、注解路由:定义路由新姿势
    6、跨域请求更简单:漂洋过域来看你
    7、引入中间件支持:分工更明确
    8、搜索器:查询利器化繁为简
    9、生成器:缓解大数据查询的内存开销
    10、数据集增强:用过都说好
    11、JSON字段查询:就是如此简单
    12、动态定义获取器:Db类也可以用获取器
    13、数组对象查询:既有情怀又够贴心
    14、查询为空的改进:懒人真多
    15、Swoole/Workerman支持:如虎添翼
    16、验证类改进:对象化定义验证规则
    17、配置和路由定义独立目录:地位提升
    18、改进的日志支持:更好用了呗
    总结:升级无悔,再战五百年

1、快速启动测试服务器:直接跨过门槛学框架

新手服务器环境不会搭?pathinfo不支持?告别这些烦恼吧,5.1内置了一个快速启动测试服务器的指令,你只需要在命令行下切换到项目根目录下面输入:

php think run

即可在localhost:8000启动一个测试服务器,而无需任何其它的WEB服务器环境,告别新手搭建环境各种问题的困惑。

相比较而言,在5.0中,必须使用

php -S localhost:8000 public/router.php

当然,该指令也支持指定端口和地址(域名),下面就是指定通过tp.com(需要自己添加host)域名的80端口访问。

php think run -H tp.com -p 80

2、对象容器引入和依赖注入改进:实用高逼格

5.1正式引入了对象容器,可以更方便的快速存取对象和管理依赖注入。这是5.1基础架构的一大调整,5.0没有容器的概念,所有的依赖对象都在请求对象中,依赖注入虽有支持但不够规范也不通用化。有了容器对象,所有的依赖对象都可以在容器里面进行统一的实例化或者绑定,需要的时候可以直接拿出来,对于解耦和减少直接依赖很有帮助。

5.1的应用类think\App本身就是容器,同时还充当了容器的管理对象,你不需要直接操作容器类就能对容器中的对象实例进行存取。而App类通常是在入口文件中实例化的,也就是说在App类实例化的同时,这个容器对象就已经准备好了。

而App类本身也提供了门面方式的静态调用,因此,你可以像下面一样方便调用。

use think\facade\App;

// 绑定对象实例到容器
App::bindTo('myClass',$obj);
// 为了避免容器过大 通常只是绑定一个类而不是对象
App::bindTo('myClass','namespace\ClassName');
// 快速获取对象实例
$obj = App::make('myClass');
// 无需绑定操作即可获取对象实例
$obj = App::make('namespace\ClassName');

容器对象中的实例默认都是单例的,如果你需要获取新的对象实例,可以在make的时候指定总是重新实例化

// 创建一个新的对象实例
$obj = App::make('namespace\ClassName',true);
// 如果需要实例化的时候传入参数,则使用
$obj = App::make('namespace\ClassName', ['name' => 'think'], true);

当然,这个只是容器内部的调用机制,实际到应用层面,大多数时候容器对象实例的获取是在依赖注入的时候自动完成的,因此你可能根本不需要用到上面的代码或者说关心容器的存在。下面就是一个典型的依赖注入的例子:

<?php
namespace app\index\controller 
use namespace\ClassName;

class My
{
	// 调用test操作方法的时候会自动从容器中获取ClassName对象实例
	public function test(ClassName $class){
		// 调用对象的方法或者获取属性
		$class->fun();
	}
}

ThinkPHP5.1没有服务提供者的概念,如果你需要对容器中的对象进行自定义实例化,可以在你的对象中添加__make静态方法来完成。

use think\App;

class ClassName
{
    /**
     * 名称
     * @var string
     */
    protected $name;

    /**
     * 构造方法
     * @access public
     */
    public function __construct($name = '')
    {
        $this->name   = $name;
    }

    public static function __make(App $app)
    {
        $name = $app['config']->get('app_name');
        return new static($name);
    }
}

现在当你在操作方法中依赖注入ClassName对象(或者通过容器的make方法获取对象实例)的时候,就会自动调用__make方法进行自定义实例化。

正因为容器的引入,使得5.1的依赖注入得以更加完善,并且支持了更多的依赖注入的场景,包括控制器架构函数,操作方法,事件响应,路由定义,模型事件等等。

3、增加门面对象:类的小助理

5.1的核心类基本上都改造成了动态类,对需要提供静态调用的类则改为提供门面对象支持,好处是可以更好的支持单元测试,由于容器的支持而使得门面对象天生具有单例的特性。

但因为用法的改变同时也让门面变成了5.0升级到5.1最大的障碍,因为你不得不调整类库的引入。

很典型的5.0中经常使用的Route类、Session类在5.1中类的方法本身没有变化,只是不再是原来的think\Routethink\Session静态类,必须改成门面静态代理类:

use think\facade\Route;
use think\facade\Session;

Route::rule('hello/:name','index/hello');
Session::get('user_name');

和依赖注入一样,通过门面对象操作的时候会自动获取容器中的对象实例(如果不存在的话则会自动实例化),因此你不用关心对象是如何实例化的。你操作think\facade\Route就和操作think\Route类是一个效果(除了使用的是静态方法之外)。门面对象唯一的不足是对IDE的自动提示不够,但可以通过给门面类添加注释解决,系统内置的门面类均有自动提示。

4、路由更对象化:又双叒叕提速?

5.1的路由基本上完全重构了,但最大程度的保留(或者说兼容)了5.0的用法,把原本的一个Route类拆分成独立的多个职责明确的类库,并且优化了路由匹配的算法,而且支持路由解析的缓存,极大提升了路由的性能。

路由规则的变量用法改进

路由定义方面主要对域名路由和路由分组的功能进行了强化,以及路由规则的更灵活定义。

之前的路由规则中变量分两种,普通变量和组合变量定义,新版把这两种合二为一了(也就是说两种变量没有任何区别,仅仅是表现方式不同,而且是出于兼容考虑)。你现在完全可以在路由规则中以任何方式定义路由变量。

例如你可以使用下面的路由规则而不用管目前的UR

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值