关于作业
来源:5-13 路由参数分析
weixin_慕桂英3444886
2020-10-12
老师,关于作业这个问题 $this->parent->getOption(‘ext’)还是没想明白,能不能讲解下。
1回答
-
TP5源码课,老师在讲解5-13章节的13分10秒的时候,布置了一个作业,如下图所示:
为什么 打印$this->option是有值的,而打印$this->parent->getOption("ext")是NULL呢??
这里$this->option这个参数很好理解,是从 注册路由的时候直接传值进来的,我们来分析下$this->parent->getOption("ext"),定位到这个方法,如图所示:
该方法返回的是本类(Rule类,实际是Domain类继承RuleGroup类,RuleGroup类继承Rule类)的属性$this->option,在此之前我发过一篇(TP5源码课程路由机制深度分析(一) )文章提到过route.php中路由注册会触发类的自动加载,Route::get( ) 这种形式其实会触发 think\Route类中的__construct( )方法,该__construct方法中有一步如下图所示:
我们在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值的
012020-10-15
相似问题