ThinkPHP 模板解析类Template分析

本文是在   thinkphp 模板解析的流程 (http://blog.csdn.net/qq_16877261/article/details/53484671)文章基础上进行讲解的,没看过的同学可以先大致浏览一下。

下面我就直接开始分析,对有必要的源码才会贴出,不必要的就不贴了。

接着上一篇文章讲解  知道  模板解析是该类中的fetch方法开始的,查看代码发现fetch方法调用了loadTemplate,而loadTemplate调用了compiler,compiler调用了parse函数

最后发现解析模板是从该类的parse函数开始的。

下面我重点对这个函数及相关的一些类进行讲解。

public function parse($content) {
    // 内容为空不解析
    if(empty($content)) return '';
    //标签库标签开始标记
    $begin      =   $this->config['taglib_begin'];//默认为   <
    $end        =   $this->config['taglib_end'];  // 默认为  >
    // 检查include语法
    $content    =   $this->parseInclude($content);
    // 检查PHP语法
    $content    =   $this->parsePhp($content);
    // 首先替换literal标签内容
    $content    =   preg_replace_callback('/'.$begin.'literal'.$end.'(.*?)'.$begin.'\/literal'.$end.'/is', array($this, 'parseLiteral'),$content);

    // 获取需要引入的标签库列表
    // 标签库只需要定义一次,允许引入多个一次
    // 一般放在文件的最前面
    // 格式:<taglib name="html,mytag..." />
    // 当TAGLIB_LOAD配置为true时才会进行检测
    if(C('TAGLIB_LOAD')) {
        $this->getIncludeTagLib($content);
        if(!empty($this->tagLib)) {
            // 对导入的TagLib进行解析
            foreach($this->tagLib as $tagLibName) {
                $this->parseTagLib($tagLibName,$content);
            }
        }
    }
    // 预先加载的标签库 无需在每个模板中使用taglib标签加载 但必须使用标签库XML前缀
    if(C('TAGLIB_PRE_LOAD')) {
        $tagLibs =  explode(',',C('TAGLIB_PRE_LOAD'));
        foreach ($tagLibs as $tag){
            $this->parseTagLib($tag,$content);
        }
    }
    // 内置标签库 无需使用taglib标签导入就可以使用 并且不需使用标签库XML前缀
    $tagLibs =  explode(',',C('TAGLIB_BUILD_IN'));
    foreach ($tagLibs as $tag){
        $this->parseTagLib($tag,$content,true);
    }
    //解析普通模板标签 {$tagName}
    $content = preg_replace_callback('/('.$this->config['tmpl_begin'].')([^\d\w\s'.$this->config['tmpl_begin'].$this->config['tmpl_end'].'].+?)('.$this->config['tmpl_end'].')/is', array($this, 'parseTag'),$content);
    return $content;
}

由代码可知需要查看parseInclude 函数

// 解析模板中的include标签
protected function parseInclude($content, $extend = true) {
    // 解析继承
    if($extend)
        $content    =   $this->parseExtend($content);
    // 解析布局
    $content    =   $this->parseLayout($content);
    // 读取模板中的include标签        $find  匹配的次数
    $find       =   preg_match_all('/'.$this->config[
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值