如何用thinkphp框架来写一个网站
php tpl模板引擎定义与使用示例本文实例讲述了php tpl模板引擎定义与使用。分享给大家供大家参考,具体如下:
tpl.php
|
<?php namespace tpl; /** * Class Tpl */ class Tpl { protected $view_dir ; //模板文件 protected $cache_dir ; //缓存文件 protected $lifetime ; //过期时间 protected $vars = []; //存放显示变量的数组 /** * Tpl constructor. * @param string $view_dir * @param string $cache_dir * @param string $lifetime */ public function __construct( $view_dir = '' , $cache_dir = '' , $lifetime = '' ) { //如果模板文件不为空,则设置,为空则为默认值 if (! empty ( $view_dir )) { if ( $this ->check_dir( $view_dir )) { $this ->view_dir = $view_dir ; } } //如果缓存文件不为空,则设置,为空时为默认值 if (! empty ( $cache_dir )) { if ( $this ->check_dir( $cache_dir )) { $this ->cache_dir = $cache_dir ; } } //如果过期时间不为空,则设置,为空时为默认值 if (! empty ( $lifetime )) { $this ->lifetime = $lifetime ; } } /** * 对外公开的方法 * @param string $name * @param string $value */ public function assign( $name , $value ) { $this ->vars[ $name ] = $value ; //将传入的参数以键值对存入数组中 } /** * 测试文件 * @param $dir_path * @return bool */ protected function check_dir( $dir_path ) { //如果文件不存在或不是文件夹,则创建 if (! file_exists ( $dir_path ) || ! is_dir ( $dir_path )) { return mkdir ( $dir_path , 0777, true); } //如果文件不可读或不可写,则设置模式 if (! is_writable ( $dir_path ) || ! is_readable ( $dir_path )) { return chmod ( $dir_path , 0777); } return true; } /** * 展示方法 * @param $view_name * @param bool $isInclude * @param null $uri */ public function display( $view_name , $isInclude =true, $uri =null) { //通过传入的文件名,得到模板文件路径 $view_path = rtrim( $this ->view_dir, '/' ) . '/' . $view_name ; //判断路径是否存在 if (! file_exists ( $view_path )) { die ( '文件不存在' ); } //通过传入的文件名得到缓存文件名 $cache_name = md5( $view_name . $uri ) . '.php' ; //缓过缓存文件名得到缓存路径 $cache_path = rtrim( $this ->cache_dir, '/' ) . '/' . $cache_name ; //判断缓存文件是否存在,如果不存在,重新生成 if (! file_exists ( $cache_path )) { $php = $this ->compile( $view_path ); //解析模板文件 file_put_contents ( $cache_path , $php ); //缓存文件重新生成 } else { //如果缓存文件存在,判断是否过期,判断模板文件是否被修改 $is_time_out = ( filectime ( $cache_path ) + $this ->lifetime) > time() ? false : true; $is_change = filemtime ( $view_path ) > filemtime ( $cache_path ) ? true : false; //如果缓存文件过期或模板文件被修改,重新生成缓存文件 if ( $is_time_out || $is_change ) { $php = $this ->compile( $view_path ); file_put_contents ( $cache_path , $php ); } } if ( $isInclude ) { extract( $this ->vars); //解析传入变量的数组 include $cache_path ; //展示缓存 } } /** * 正则解析模板文件 * @param string $file_name * @return mixed|string */ protected function compile( $file_name ) { $html = file_get_contents ( $file_name ); //获取模板文件 //正则转换数组 $array = [ '{$%%}' => '<?=$\1?>' , '{foreach %%}' => '<?php foreach (\1): ?>' , '{/foreach}' => '<?php endforeach ?>' , '{include %%}' => '' , '{if %%}' => '<?php if (\1): ?>' , '{/if}' => '<?php endif ?>' , '{for %%}' => '<?php for (\1): ?>' , '{/for}' => '<?php endfor ?>' , '{switch %%}' => '<?php switch (\1) ?>' , '{/switch}' => '<?php endswitch ?>' ]; //遍历数组,生成正则表达式 foreach ( $array AS $key => $value ) { //正则表达式, $pattern = '#' . str_replace ( '%%' , '(.+?)' , preg_quote( $key , '#' )) . '#' ; if ( strstr ( $pattern , 'include' )) { $html = preg_replace_callback( $pattern , [ $this , 'parseInclude' ], $html ); } else { $html = preg_replace( $pattern , $value , $html ); } } return $html ; } /** * 处理include表达式 * @param array $data * @return string */ protected function parseInclude( $data ) { $file_name = trim( $data [1], '\'"' ); $this ->display( $file_name , false); $cache_name = md5( $file_name ) . '.php' ; $cache_path = rtrim( $this ->cache_dir, '/' ) . '/' . $cache_name ; return '<?php include "' . $cache_path . '" ?>' ; } } |
user_tpl,,,,从数据库中取值,作为参数传到模板文件,再解析模板文件
|
<?php include './sql/pdo.sql.php' ; include 'tpl.php' ; $tpl = new tpl\Tpl( './view/' , './cache/' , 3000); $link = new pdo_sql(); $dat = [ 'menu_name' , 'menu_url' ]; $res = $link ->table( 'blog_menu' )->field( $dat )->order( 'id ASC' )->select(); $tpl ->assign( 'menu' , $res ); $tpl ->display( 'index.html' ); |
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/qq_42176520/article/details/80426384