PHP实现简朴的模板引擎成果示例
发布时间:2021-03-07 03:23:44 所属栏目:编程 来源:网络整理
导读:本篇章节讲授PHP实现简朴的模板引擎成果。供各人参考研究详细如下: php web开拓中普及采纳mvc的计划模式,controller转达给view层的数据,必需通过模板引擎才气理会出来。实现一个简朴的仅仅包括if,foreach标签,理会$foo变量的模板引擎。 编写t
副问题[/!--empirenews.page--]
本篇章节讲授PHP实现简朴的模板引擎成果。分享给各人供各人参考,详细如下: php web开拓中普及采纳mvc的计划模式,controller转达给view层的数据,必需通过模板引擎才气理会出来。实现一个简朴的仅仅包括if,foreach标签,理会$foo变量的模板引擎。 编写template模板类和compiler编译类。代码如下: '.php',//文件后缀名 'templateDir' => '../views/',//模板地址文件夹 'compileDir' => '../runtime/cache/views/',//编译后存放的目次 'suffixCompile' => '.php',//编译后文件后缀 'isReCacheHtml' => false,//是否必要从头编译成静态html文件 'isSupportPhp' => true,//是否支持php的语法 'cacheTime' => 0,//缓存时刻,单元秒 ]; private $_file;//带编译模板文件 private $_valueMap = [];//键值对 private $_compiler;//编译器 public function __construct($compiler,$config = []) { $this->_compiler = $compiler; $this->_config = array_merge($this->_config,$config); } /** * [assign 存储节制器分派的键值] * @param [type] $values [键值对荟萃] * @return [type] [description] */ public function assign($values) { if (is_array($values)) { $this->_valueMap = $values; } else { throw new Exception('节制器分派给视图的值必需为数组!'); } return $this; } /** * [show 揭示视图] * @param [type] $file [带编译缓存的文件] * @return [type] [description] */ public function show($file) { $this->_file = $file; if (!is_file($this->path())) { throw new Exception('模板文件'. $file . '不存在!'); } $compileFile = $this->_config['compileDir'] . md5($file) . $this->_config['suffixCompile']; $cacheFile = $this->_config['compileDir'] . md5($file) . '.html'; //编译后文件不存在可能缓存时刻已到期,从头编译,从头天生html静态缓存 if (!is_file($compileFile) || $this->isRecompile($compileFile)) { $this->_compiler->compile($this->path(),$compileFile,$this->_valueMap); $this->_config['isReCacheHtml'] = true; if ($this->isSupportPhp()) { extract($this->_valueMap,EXTR_OVERWRITE);//从数组中将变量导入到当前的标记表 } } if ($this->isReCacheHtml()) { ob_start(); ob_clean(); include($compileFile); file_put_contents($cacheFile,ob_get_contents()); ob_end_flush(); } else { readfile($cacheFile); } } /** * [isRecompile 按照缓存时刻判定是否必要从头编译] * @param [type] $compileFile [编译后的文件] * @return boolean [description] */ private function isRecompile($compileFile) { return time() - filemtime($compileFile) > $this->_config['cacheTime']; } /** * [isReCacheHtml 是否必要从头缓存静态html文件] * @return boolean [description] */ private function isReCacheHtml() { return $this->_config['isReCacheHtml']; } /** * [isSupportPhp 是否支持php语法] * @return boolean [description] */ private function isSupportPhp() { return $this->_config['isSupportPhp']; } /** * [path 得到模板文件路径] * @return [type] [description] */ private function path() { return $this->_config['templateDir'] . $this->_file . $this->_config['suffix']; } }_valueMap['1']; ?>",'','','',"_valueMap['1'] as $k => $v) {?>",'',''
];
/**
* [compile 编译模板文件]
* @param [type] $source [模板文件]
* @param [type] $destFile [编译后文件]
* @param [type] $values [键值对]
* @return [type] [description]
*/
public function compile($source,$destFile,$values)
{
$this->_content = file_get_contents($source);
$this->_valueMap = $values;
if (strpos($this->_content,'{$') !== false) {
$this->_content = preg_replace($this->_patten,$this->_translation,$this->_content);
}
file_put_contents($destFile,$this->_content);
}
}
我们的节制器就可以挪用template中的assign要领举办赋值,show要领举办模板编译了。 template = function () use ($di,$templateConfig) { $di->compiler = 'foobaseCompiler'; $compiler = $di->compiler; return new foobaseTemplate($compiler,$templateConfig); }; $di->template->assign($values)->show($file); }Container类如下: s[$k] = $c; } public function __get($k) { return $this->build($this->s[$k]); } /** * 自动绑定(Autowiring)自动理会(Automatic Resolution) * * @param string $className * @return object * @throws Exception */ public function build($className) { // 假如是闭包函数(closures) if ($className instanceof Closure) { // 执行闭包函数 return $className($this); } if (isset(self::$instances[$className])) { return self::$instances[$className]; } /** @var ReflectionClass $reflector */ $reflector = new ReflectionClass($className); // 搜查类是否可实例化,解除抽象类abstract和工具接口interface if (!$reflector->isInstantiable()) { throw new Exception($reflector . ': 不能实例化该类!'); } /** @var ReflectionMethod $constructor 获取类的结构函数 */ $constructor = $reflector->getConstructor(); // 若无结构函数,直接实例化并返回 if (is_null($constructor)) { return new $className; } // 取结构函数参数,通过 ReflectionParameter 数组返回参数列表 $parameters = $constructor->getParameters(); // 递归理会结构函数的参数 $dependencies = $this->getDependencies($parameters); // 建设一个类的新实例,给出的参数将转达到类的结构函数。 $obj = $reflector->newInstanceArgs($dependencies); self::$instances[$className] = $obj; return $obj; } /** * @param array $parameters * @return array * @throws Exception */ public function getDependencies($parameters) { $dependencies = []; /** @var ReflectionParameter $parameter */ foreach ($parameters as $parameter) { /** @var ReflectionClass $dependency */ $dependency = $parameter->getClass(); if (is_null($dependency)) { // 是变量,有默认值则配置默认值 $dependencies[] = $this->resolveNonClass($parameter); } else { // 是一个类,递归理会 $dependencies[] = $this->build($dependency->name); } } return $dependencies; } /** * @param ReflectionParameter $parameter * @return mixed * @throws Exception */ public function resolveNonClass($parameter) { // 有默认值则返回默认值 if ($parameter->isDefaultValueAvailable()) { return $parameter->getDefaultValue(); } throw new Exception('I have no idea what to do here.'); } }要想以键值对的方法会见工具的属性必需实现ArrayAccess接口的四个要领, (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读