关于作业

来源:5-13 路由参数分析

weixin_慕桂英3444886

2020-10-12

老师,关于作业这个问题 $this->parent->getOption(‘ext’)还是没想明白,能不能讲解下。

写回答

1回答

爱因诗贤

2020-10-14

TP5源码课,老师在讲解5-13章节的13分10秒的时候,布置了一个作业,如下图所示:


//img.mukewang.com/szimg/5f868a6709965b0815040751.jpg

为什么 打印$this->option是有值的,而打印$this->parent->getOption("ext")是NULL呢??

这里$this->option这个参数很好理解,是从 注册路由的时候直接传值进来的,我们来分析下$this->parent->getOption("ext"),定位到这个方法,如图所示:

//img.mukewang.com/szimg/5f868a800916ffac12660716.jpg

该方法返回的是本类(Rule类,实际是Domain类继承RuleGroup类,RuleGroup类继承Rule类)的属性$this->option,在此之前我发过一篇(TP5源码课程路由机制深度分析(一) )文章提到过route.php中路由注册会触发类的自动加载,Route::get( ) 这种形式其实会触发 think\Route类中的__construct( )方法,该__construct方法中有一步如下图所示:

//img.mukewang.com/szimg/5f868aae09c82e0614140852.jpg


//img1.sycdn.imooc.com/szimg/5f868ab8096d4d5114250799.jpg

我们在route.php中注册路由Route::get( )这种形式定位到 think\Route类中的 rule( )方法,

调用$this->group->addRule( )这个的时候的$this->group属性其实际是实例化think\route\Domain类(具体过程请参考我发的上一篇关于$this->group属性的文章),在think\route\Domain类的_construct方法中有一步是 $this->option = $option,  很明显,这里的$option在上一层没有传递过来,所以老师布置作业那里调用的 $this->option就是null,同学们可以在这里增加一个参数试试,我想要强调一下,在路由注册整个过程 ,其实是在使用 think\route\Domain类,  think\route\Domain类继承 think\route\RuleGroup类,think\route\RuleGroup类继承think\route\Rule类,




所以老师布置得作业答案诉述如下:

$this->option参数是由think\Route 中的 rule方法传递过来的,是有值得

$this->parent->getOption("ext")中的$this->option是在think\Route中的__construct中实例化 Domain类的时候传递过来的,整个调用过程都是围绕 think\route\Domain类进行的,是没有$option值的

//img.mukewang.com/szimg/5f868c71091b6c8d46151290.jpg

0
1
weixin_慕桂英3444886
非常感谢!
2020-10-15
共1条回复

BAT资深工程师解析Tp5+Tp6底层源码

一门课掌握主流Tp5+最新Tp6框架底层,拥抱新潮流

686 学习 · 145 问题

查看课程