smarty编译过程

(基于V2.6.20)

1,Smarty.class.php

//构造函数
function Smarty()
{
$this->assign('SCRIPT_NAME', ...);
}

//assign函数
function assign($tpl_var, $value = null)
{
if (is_array($tpl_var)){ //可以直接传递数组
foreach ($tpl_var as $key => $val) {
if ($key != '') {
$this->_tpl_vars[$key] = $val;
}
}
} else {
if ($tpl_var != '')
$this->_tpl_vars[$tpl_var] = $value;
}
}
重要:$this->_tpl_vars是保存模板变量的

//display方法
function display($resource_name, $cache_id = null, $compile_id = null)
{
$this->fetch($resource_name, $cache_id, $compile_id, true);
}

//这个方法的逻辑还没有完全梳理清楚
function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
{
//debug....
//cache....
//调用方法_compile_resource来编译
}


//
function _compile_resource($resource_name, $compile_path)
{
//调用方法_compile_source
}

/**
* 编译给出的模板文件
*
* @param string $resource_name
* @param string $source_content
* @param string $compiled_content
* @return boolean
*/
function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null)
{
if (file_exists(SMARTY_DIR . $this->compiler_file)) {
require_once(SMARTY_DIR . $this->compiler_file);
} else {
// use include_path
require_once($this->compiler_file);
}

//实例化编译对象
$smarty_compiler = new $this->compiler_class; //Smarty_Compiler

//初始化编译对象(传递相关的变量,包括上面的模板变量)
$smarty_compiler->template_dir = $this->template_dir;
$smarty_compiler->compile_dir = $this->compile_dir;
$smarty_compiler->plugins_dir = $this->plugins_dir;
$smarty_compiler->config_dir = $this->config_dir;
$smarty_compiler->force_compile = $this->force_compile;
$smarty_compiler->caching = $this->caching;
$smarty_compiler->php_handling = $this->php_handling;
$smarty_compiler->left_delimiter = $this->left_delimiter;
$smarty_compiler->right_delimiter = $this->right_delimiter;
$smarty_compiler->_version = $this->_version;
$smarty_compiler->security = $this->security;
$smarty_compiler->secure_dir = $this->secure_dir;
$smarty_compiler->security_settings = $this->security_settings;
$smarty_compiler->trusted_dir = $this->trusted_dir;
$smarty_compiler->use_sub_dirs = $this->use_sub_dirs;
$smarty_compiler->_reg_objects = &$this->_reg_objects;
$smarty_compiler->_plugins = &$this->_plugins;
$smarty_compiler->_tpl_vars = &$this->_tpl_vars; //模板变量
$smarty_compiler->default_modifiers = $this->default_modifiers;
$smarty_compiler->compile_id = $this->_compile_id;
$smarty_compiler->_config = $this->_config;
$smarty_compiler->request_use_auto_globals = $this->request_use_auto_globals;

if (isset($cache_include_path) && isset($this->_cache_serials[$cache_include_path])) {
$smarty_compiler->_cache_serial = $this->_cache_serials[$cache_include_path];
}
$smarty_compiler->_cache_include = $cache_include_path;


//编译
$_results = $smarty_compiler->_compile_file($resource_name, $source_content, $compiled_content);

if ($smarty_compiler->_cache_serial) {
$this->_cache_include_info = array(
'cache_serial'=>$smarty_compiler->_cache_serial
,'plugins_code'=>$smarty_compiler->_plugins_code
,'include_file_path' => $cache_include_path);

} else {
$this->_cache_include_info = null;

}

return $_results;
}



2,Smarty_Compiler.class.php

//构造函数
function Smarty_Compiler(){
//初始化各种匹配用的正则表达式,例如匹配函数的:$this->_func_regexp = '[a-zA-Z_]\w*';
}


//编译,使用$compiled_content返回编译好的php代码
/*
返回的代码包括两部分:
1,头部,如下:
<?php //Smarty version 2.6.20, created on 2009-12-21 10:38:57 compiled from index.tpl
?>
<?php
require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
//加载自定义插件,如load_data
smarty_core_load_plugins(array('plugins' => array(array('function', 'load_data', 'index.tpl', 20, false),)), $this); ?>
<?php $_smarty_tpl_vars = $this->_tpl_vars; //模板变量赋值
//加载头部模板
$this->_smarty_include(array('smarty_include_tpl_file' => 'header.tpl', 'smarty_include_vars' => array()));
$this->_tpl_vars = $_smarty_tpl_vars;
unset($_smarty_tpl_vars);
?>

2,模板主体
*/
function _compile_file($resource_name, $source_content, &$compiled_content){
//处理文本块
//编译所有标签,调用_compile_tag方法(重要)
}
注:
1,literal标签内的数据smarty不会去分析(可用于显示有可能包含大括号等字符信息的 javascript脚本)
2,可以使用php标签来嵌套php代码

参考:http://code.google.com/p/cyy0523xc/source/browse/trunk/php/Smarty%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B.txt

原文地址:https://www.cnblogs.com/zcy_soft/p/1999062.html