怎么改php源码核心,20180105 - ThinkPHP5,核心源代码阅读之模板赋值

前言

在线课程中,我会出一系列的“详解”课程,针对TP5框架中各个知识点,进行详细解说。课程主要分成两个部分,语法解读(非常入门)和核心实现(涉及TP框架核心源代码的阅读,非常复杂)

相关课程会发布在 “ThinkPHP 5 框架(入门篇)”,也就是 “就业版课程 https://www.sodevel.com/course/3”

下面,以文字的形式给大家分享一下模板赋值的基本知识。

基本概念

模板赋值,就是将变量从 控制器 传递到 视图的方法。

基本语法

TP5 提供了多种方法,实现赋值功能。

assign()

必须在控制器中,且继承了\think\Controller 的情况下使用。$this->assign('a',1);

$this->assign(['a'=>1, 'b'=>2]);

以上两种语法均可。

$this->fetch()

必须在控制器中,且继承了\think\Controller 的情况下使用。$模板变量数组 = ['a'=>1];

$this->fetch('模板文件名',$模板变量数组);

助手函数 view()

和 $this->fetch() 几乎一样,只是改成了 view('模板文件名', $模板变量数组);

share()

可以在任何地方使用。\think\View::share($模板变量数组);

后记

以上几种方法,都是为了模板变量传递,只要能实现,用哪种方法都是没区别的。

我习惯用 助手函数,特殊情况下会用 assign,无奈的情况下会使用 share(),在我后续的课程中有用到多种方法(暂时没有share),实践出真知吧。

这些在TP5手册上都有,我就不细说了。

模板赋值的实现

以下涉及到 thinkphp5 的核心源代码阅读,看不懂不要慌,因为很多新同学都看不懂。

以 view() 助手函数为例

在 \thinkphp\helper.php 中定义了 view 函数。

代码主要功能:Response::create($template, 'view', $code)->replace($replace)->assign($vars);

实际结果,调用 think\response\View 对象的 assign() 方法。

think\response\View::assign()

该方法非常简单,将模板变量写入 类属性 $this->vars

谁使用了 $this->vars 这个类属性?

在 think\response\View::output() 方法中,使用了这个类属性。ViewTemplate::instance(Config::get('template'), Config::get('view_replace_str'))

->fetch($data,$this->vars,$this->replace);

以上代码其实是调用了 think\View 类的 fetch() 方法。

注意:思考一个问题,谁调用了 View::output(),文末会讲。

think\View::fetch()

做的事情比较多,和模板赋值有关的如下。$this->engine->$method($template, $vars, $config);

实际是,调用了 think\view\driver\Think 类的 fetch 方法

think\view\driver\Think::fetch()

和模板赋值有关的代码如下。

this−>template−>fetch(this−>template−>fetch(template, data,data,config);

实际调用的是 think\Template::fetch() 方法。

think\Template::fetch()

与模板赋值有关的代码如下。$this->storage->read($cacheFile,$this->data);

实际是调用了 \think\template\driver\File::read() 方法。

\think\template\driver\File::read()

主要做了两件事。//将模板变量数组打碎,变为独立变量。

extract($vars, EXTR_OVERWRITE);

然后,//执行模板文件

include$cacheFile;

至此,模板已经执行完毕,模板变量自然也用完了。

再看,think\Template::fetch()

模板执行完毕之后,获取执行结果,并 echo 到网页上。$content= ob_get_clean();

echo$content;

至此

模板变量的赋值结束,并且在网页上显示了编译后的模板内容。

谁调用了 View::output()

这个,我们要从头看起

public/index.php

程序的唯一入口,你访问任何网址,都是从这里开始的。//包含了 start.php

include('...start.php')

\thinkphp\start.php// 执行应用

App::run()->send();

这段代码实际等于 \think\response\View::send() 方法

\think\response\View::send()

该方法,来自 View 的父类,也就是 \think\Response 类。

\think\Response::send()

里边调用了 $this->getContent(),这是关键点。

\think\Response::getContent()

里边的这段代码,调用了 内部的 output()方法,又因为 \think\response\View 子类的同名方法覆盖原则,执行的是:\think\response\View::output() 方法。$content=$this->output($this->data);

至此

你应该知道模板赋值的整个过程了。

后记

以上内容,在视频课程中均有讲解(用了大约30分钟),理论上更为 唠叨 和 细致 。因为讲的是模板赋值的过程,很多无关代码都过滤掉了,大家有兴趣可以慢慢深入。

特别注意

以上代码,说起来轻松,读起来难。

新人经常会被跳晕,很多代码细节不理解,这都是正常的。如果可能,你可以用1个月甚至更久的时间,深入研究TP5的源代码,你的进步将是大跃进级别的!

PS:如果是初学者(刚刚看了TP5的基础课),就不要尝试了,可能会很悲伤。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值