热门标签 | 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的基础课),就不要尝试了,可能会很悲伤。



推荐阅读
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
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社区 版权所有