热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

前言在线课程中,我会出一系列的“详解”课程,针对TP5框架中各个知识点,进行详细解说。课程主要分成两个部分,语法解读(非常入

前言

在线课程中,我会出一系列的“详解”课程,针对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的基础课),就不要尝试了,可能会很悲伤。



推荐阅读
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文详细解析了Autofac在高级应用场景中的具体实现,特别是如何通过注册泛型接口的类来优化依赖注入。示例代码展示了如何使用 `builder.RegisterAssemblyTypes` 方法,结合 `typeof(IEventHandler).Assembly` 和 `Where` 过滤条件,动态注册所有符合条件的类,从而简化配置并提高代码的可维护性。此外,文章还探讨了这一方法在复杂系统中的实际应用及其优势。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 在编译 PHP7 的 PDO MySQL 扩展时,可能会遇到 `[mysql_driver.lo]` 错误 1。该问题通常出现在 `pdo_mysql_fetch_error_func` 函数中。本文详细介绍了导致这一错误的常见原因,包括依赖库版本不匹配、编译选项设置不当等,并提供了具体的解决步骤和调试方法,帮助开发者快速定位并解决问题。 ... [详细]
  • 在Android开发中,当TextView的高度固定且内容超出时,可以通过设置其内置的滚动条属性来实现垂直滚动功能。具体来说,可以通过配置`android:scrollbars="vertical"`来启用垂直滚动,确保用户能够查看完整的内容。此外,为了优化用户体验,建议结合`setMovementMethod(ScrollerMovementMethod.getInstance())`方法,使滚动操作更加流畅和自然。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
author-avatar
晴felleman_110
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有