当前位置: 首页 > 后端技术 > PHP

ThinkPHP6源码分析Request

时间:2023-03-30 00:38:55 PHP

获取Request对象在进入正题之前,我们需要关注一下make方法。因为用过之前版本的人已经开始接受Container的概念,所以这个新版本增强了Container的功能,而创建Request对象的本质在于make方法。倒不如说整个框架核心类都在用这个方法。我们来看看这个方法是如何创建对象的。具体说明见各段注释publicfunctionmake(string$abstract,array$vars=[],bool$newInstance=false){//首先实例属性是一个数组,是主要的存储容器object//如果对象存在如果在容器中不需要重新创建,直接从容器中获取if(isset($this->instances[$abstract])&&!$newInstance){return$this->实例[$摘要];}//bind属性在之前的应用初始化中已经接触过了,//是容器对象的绑定标识,区别于instances数组,//它只是存放一个类字符串,需要实例化得到对象实例,如下这个函数被实现//如果bind标识符存在if(isset($this->bind[$abstract])){//get$concretefrombind=$this->bind[$摘要];//concrete可以是类名或者匿名函数//直接执行匿名函数if($concreteinstanceofClosure){$object=$this->invokeFunction($concrete,$vars);}else{//否则继续创建,因为此时对象还没有创建return$this->make($concrete,$vars,$newInstance);}}else{//如果标识中没有指定需要的类名,则需要实例化。//其实这才是真正的类创建,后面的方法直接依赖注入$object=$this->invokeClass($abstract,$vars);}//对于不需要创建实例的类,直接在容器中管理if(!$newInstance){$this->instances[$abstract]=$object;}//最后返回对象return$object;}可能你到这里还是有点迷糊,这里就用Request创建来梳理一下吧。我们来看看创建Request的过程。分析下面这段代码可以在run方法中找到。这段代码需要仔细推敲,不然不知道是哪个Request对象?//自动创建请求对象$request=$request??$this->app->make('request',[],true);$this->app->instance('request',$request);$newInstance在创建Request时设置为true,表示每个请求都需要重新创建。此时instances中没有Request对象,继续忽略。在进入bind之前,先看bind里面都有什么了?array(22){["app"]=>string(9)"think\App"["cache"]=>string(11)"think\缓存"["config"]=>string(12)"think\Config"["console"]=>string(13)"think\Console"["cookie"]=>string(12)"think\Cookie"["db"]=>string(8)"think\Db"["env"]=>string(9)"think\Env"["event"]=>string(11)"think\Event"["http"]=>string(10)"think\Http"["lang"]=>string(10)"think\Lang"["log"]=>string(9)"think\Log"["middleware"]=>string(16)"think\Middleware"["request"]=>string(13)"think\Request"["response"]=>string(14)"think\Response"["route"]=>string(11)"think\Route"["session"]=>string(13)"think\Session"["validate"]=>string(14)"think\Validate"["view"]=>字符串(10)"think\View"["filesystem"]=>string(16)"think\Filesystem"["Psr\Log\LoggerInterface"]=>string(9)"think\Log"["think\Request"]=>string(11)"app\Request"["think\exception\Handle"]=>string(19)"app\ExceptionHandle"}默认已经有很多类名了,这些都是框架默认的,不用管,我们只看requestkeyname和'thinkRequest',还有最后两个think\Request和think\exception\Handle是在框架初始化的时候注入的,不清楚的可以看上一节当时注入的是think\Request进入正题,显然'request'存在于bind中,而且request的值不是匿名函数,而是一个字符串think\Request,只能继续make创建,找到app\Request对应的值think\Request,和bind不存在,所以直接解析类名。这里大概可以理解,实际框架用的不是thinkRequest对象,而是appRequest对象。解析后Request对象也放到了container.下面是请求的执行过程是的.F或者更多学习内容,可以访问【可比标准工厂】中的优质PHP架构师教程目录。只要能读懂,就能保证你的薪水更上一层楼(持续更新中)。以上内容希望对大家有所帮助。很多PHPer进阶,总会遇到一些问题和瓶颈。业务代码写多了没有方向感。我不知道从哪里开始改进。我整理了一些这方面的资料,包括但不限于:分布式架构、高扩展性、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等进阶干货知识点免费分享给大家,需要的可以点击链接领取进阶PHP月薪30k>>>架构师成长之路【免费获取】转视频和采访资料】本文由博客群发、多发贴等运营工具平台OpenWrite发布。