文档章节

简单的模板引擎

phala
 phala
发布于 2016/03/11 18:05
字数 503
阅读 132
收藏 2

觉得基础不扎实,框架又非常臃肿,想要用原生php写东西。

还是沿用了基本的MVC思路。

  • autoload一些核心类的原理。

在入口文件里包含的类的__autoload并不会尝试加载。(__autoload — Attempt to load undefined class)

这时候就可以用spl_autoload_register()来注册自己想要自动加载的函数:

spl_autoload_register(array('ClassName','autoload'));

注意:SPL是Standard PHP Library 的缩写,php5中引入。

看到了两个模板引擎的代码:

1.http://www.lanzusheng.cn/Article/32.html

2.http://www.luoriver.com/news-d-i146.html

第一个看得有点晕,仔细研究了第二个方法,虽然没有像第一个那些实现一些流程判断,但是足够用了:

 //变量前界定符
    var $left_limiter='<?=';
   
    //变量后界定符    
    var $right_limiter='?>';
   
    //存储变量值的数组对象
    var $assign_vars=array();
   
    //遍历深度
    var $searchlevel=2;
    class templater   
    {
        //将变量赋值给模板引擎
        function assign($varnames,$varvalues)
     {
            //get variable name array
            $arrvarname=explode(';',$varnames);
           
            //get variable value array
            if(count($arrvarname)<=1) //can support ";" in value
                   $arrvarvalue=array($varvalues);
            else //can not has ";" in variable name or variable value
                   $arrvarvalue=explode(';',$varvalues);
           
            //add to intenal variable array       
            for($i=0;$i<count($arrvarname);$i++)
            {                         
                   $this->assign_vars[$arrvarname[$i]]=$arrvarvalue[$i];                    
            }
     }
 
     //根据变量名、变量值、模板内容、界定符对内容中的变量用实际值进行替换
     function parsevariable($content,$varname,$varvalue,$left_limiter='',$right_limiter='')
     {
            //get limiter
            if(empty($left_limiter))
                   $left_limiter=$this->left_limiter;
            if(empty($right_limiter))
                   $right_limiter=$this->right_limiter;
                  
            //get variable name
            $varname=$this->wrapreskeyword($varname);                
           
            //parse variable value
            foreach(array(preg_replace("/['\"]/","'",$varname),preg_replace("/['\"]/","\"",$varname)) as $tempvarname)
                 $content=preg_replace("/".$this->wrapreskeyword($left_limiter)."\s*[$]".$tempvarname."\s*".$this->wrapreskeyword($right_limiter)."/i",$varvalue, $content);                                                        
           
            //return result 
            return $content;           
     }
             
              //返回替换后的内容
              function get($templatefile)
       {                  
              global $template,$defaulttemplate;
             
              //define variable     
              $filecontent="";
             
              //get template file content
              if(file_exists($templatefile))   //if not exist,use default template
                     $filecontent=readfilecontent($templatefile);         
              else
                     $filecontent=readfilecontent(str_replace('/'.$template.'/','/'.$defaulttemplate.'/',$templatefile));        
             
              //replace every variable with value
              for($i=0;$i<$this->searchlevel;$i++)
              {
                     foreach ($this->assign_vars as $varname=>$varvalue)             
                     {    
                            //convert variable with value               
                            if(strpos($filecontent,$varname))                             
                                   $filecontent=$this->parsevariable($filecontent,$varname,$varvalue);               
                     }
              }
                    
              //return content
              return $filecontent;
       }
    }
      
//实际的用法
 
       $objtemplate=new templater; //创建模板引擎对象
 
       //变量赋值
       $objtemplate->assign('var',”hello world!”);  
 
       //显示内容
       echo $objtemplate->get("test.html");

感觉受到smarty影响,所以界定符还是换成 { },毕竟比<?php ?>美观。。


© 著作权归作者所有

共有 人打赏支持
phala
粉丝 5
博文 104
码字总数 53470
作品 0
成都
程序员
私信 提问
Flask实例教程八

Flask本身是需要依靠Jinja2。其模板引擎也采用的是Jinja2。 本博文重点介绍一下Jinja2模板引擎的基本使用。 一:模板的基本使用 app.pyfrom flask import Flaskfrom flask import render_temp...

Jeff_Linux
2014/06/06
0
0
一个精巧的Javascript Template引擎

基于MVC模式的web框架在渲染页面时,都会提供可以内嵌后端语言的模板引擎,用于使用动态数据生成页面。在某些场景下,无法使用后端的模板引擎,但又需要使用动态数据渲染页面内容,这时便可选...

con
2014/03/29
0
4
13 款 JavaScript 模板引擎

JavaScript 在生成各种页面内容时如果能结合一些模板技术,可以让逻辑和数据之间更加清晰,本文介绍 X 款 JavaScript 的模板引擎。(排名不分先后顺序) 1. Mustache 基于javascript 实现的模...

红薯
2012/04/15
16.2K
5
字符串模板浅析

前言 虽然现在有各种前端框架来提高开发效率,但是在某些情况下,原生 JavaScript 实现的组件也是不可或缺的。例如在我们的项目中,需要给业务方提供一个通用的支付组件,但是业务方使用的技...

滴滴WebApp架构组
2017/12/18
0
0
推荐13款javascript模板引擎

javaScript 在生成各种页面内容时如果能结合一些模板技术,可以让逻辑和数据之间更加清晰,本文介绍 X 款 JavaScript 的模板引擎。(排名不分先后顺序) 1. Mustache 基于javascript 实现的模...

李朝强
2013/07/29
0
1

没有更多内容

加载失败,请刷新页面

加载更多

《人月神话》读后感

前两天看完了《人月神话》,最初是被这本书的名字吸引了,然后再在上搜了一下,人月确实是一个神话,那种不可能实现的神话……(!| ̄▽ ̄) 好久没有看过这种每章开始都引用一段名人名言的书了...

ninjaFrog
昨天
0
0
matlab-线性代数 施密特正交化

  matlab : R2018a 64bit     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   code clearclc% 施密特正......

志成就
昨天
0
0
08 分支管理 —— 多人协作

08 分支管理 —— 多人协作 多人协作 本节内容: 查看远程库信息,使用git remote -v;本地新建的分支如果不推送到远程,对其他人就是不可见的;从本地推送分支,使用git push origin bra...

lwenhao
昨天
0
0
开始使用Filebeat

认识Beats Beats是用于单用途数据托运人的平台。它们以轻量级代理的形式安装,并将来自成百上千台机器的数据发送到Logstash或Elasticsearch。 (画外音:通俗地理解,就是采集数据,并上报到...

北极南哥
昨天
3
0
shell getopts template

!/bin/bash# ------------------------------------------------------------------# [Author] Title# Description# ---------------------------------------------------......

易野
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部