간단 한 사용자 정의 php 템 플 릿 엔진

9710 단어 php템 플 릿 엔진
템 플 릿 엔진 의 사상 은 MVC(Model View Controller)모델,즉 모델 층,보기 층,컨트롤 러 층 에서 기원 되 었 다.
웹 엔 드 에서 모델 층 이 데이터베이스 로 작 동 합 니 다.보기 층 은 템 플 릿,즉 웹 전단 입 니 다.Controller 는 데이터 와 요청 에 대한 PHP 의 다양한 조작 입 니 다.템 플 릿 엔진 은 시각 층 과 다른 층 을 분리 하여 phop 코드 와 html 코드 가 섞 이지 않도록 하기 위 한 것 입 니 다.php 코드 와 html 코드 가 혼 합 될 때 코드 의 가 독성 이 떨 어 지고 코드 후기의 유지 보수 가 어려워 지기 때문이다. 
대부분의 템 플 릿 엔진 의 원 리 는 차이 가 많 지 않 습 니 다.핵심 은 정규 표현 식 으로 템 플 릿 을 해석 하고 약 정 된 특정한 표지 문 구 를 phop 문 구 를 phop 문 구 를 컴 파일 한 다음 에 호출 할 때 include 컴 파일 된 파일 만 있 으 면 phop 문 구 를 html 문 구 를 분리 할 수 있 습 니 다.심지어 php 의 출력 을 버퍼 에 출력 한 다음 에 템 플 릿 을 정적 html 파일 로 컴 파일 할 수 있 습 니 다.이렇게 요청 할 때 정적 html 파일 을 직접 열 어서 요청 속도 가 크게 빨 라 집 니 다. 
간단 한 사용자 정의 템 플 릿 엔진 은 두 가지 유형 입 니 다.첫 번 째 는 템 플 릿 류 이 고 두 번 째 는 컴 파일 류 입 니 다.
우선 컴 파일 클래스: 

class CompileClass {
 private $template;  //      
 private $content;  //        
 private $compile_file;  //       
 private $left = '{';  //     
 private $right = '}';  //     
 private $include_file = array();  //      
 private $config;  //        
 private $T_P = array();  //         
 private $T_R = array();  //        
 
 public function __construct($template, $compile_file, $config) {}
 
 public function compile() {
  $this->c_include();
  $this->c_var();
  $this->c_staticFile();
  file_put_contents($this->compile_file, $this->content);
 }
 
 //   include
 public function c_include() {}
 
 //            
 public function c_var() {}
 
 //     JavaScript     
 public function c_staticFile() {}
}
컴 파일 류 의 대략적인 구 조 는 위 와 같 습 니 다.컴 파일 류 의 작업 은 설정 한 파일 에 따라 작 성 된 템 플 릿 파일 을 규칙 에 따라 해석 하고 교체 한 다음 파일 에 출력 하 는 것 입 니 다.이 파일 의 내용 은 php 와 html 가 뒤 섞 여 있 지만 템 플 릿 엔진 을 사용 하여 개발 할 때 이 파일 에 신경 쓸 필요 가 없습니다.템 플 릿 파일,즉 html 와 우리 가 정의 한 탭 이 혼 합 된 파일 이기 때 문 입 니 다.이렇게 해서 View 와 다른 두 층 이 분리 되 었 다. 
이 사용자 정의 템 플 릿 엔진 에서 나의 좌우 경계선 부 호 는 대괄호 이 고 구체 적 인 해석 규칙 은construct()중 

//           
$this->T_P[] = "/$this->left\s*\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\xf7-\xff]*)\s*$this->right/";
$this->T_P[] = "/$this->left\s*(loop|foreach)\s*\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\xf7-\xff]*)\s*$this->right/";
$this->T_P[] = "/$this->left\s*(loop|foreach)\s*\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\xf7-\xff]*)\s+"
  . "as\s+\\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\xf7-\xff]*)$this->right/";
$this->T_P[] = "/$this->left\s*\/(loop|foreach|if)\s*$this->right/";
$this->T_P[] = "/$this->left\s*if(.*?)\s*$this->right/";
$this->T_P[] = "/$this->left\s*(else if|elseif)(.*?)\s*$this->right/";
$this->T_P[] = "/$this->left\s*else\s*$this->right/";
$this->T_P[] = "/$this->left\s*([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\xf7-\xff]*)\s*$this->right/";

//           
$this->T_R[] = "<?php echo \$\\1; ?>";
$this->T_R[] = "<?php foreach((array)\$\\2 as \$K=>\$V) { ?>";
$this->T_R[] = "<?php foreach((array)\$\\2 as &\$\\3) { ?>";
$this->T_R[] = "<?php } ?>";
$this->T_R[] = "<?php if(\\1) { ?>";
$this->T_R[] = "<?php } elseif(\\2) { ?>";
$this->T_R[] = "<?php } else { ?>";
$this->T_R[] = "<?php echo \$\\1; ?>";

위의 해석 규칙 은 기본 적 인 출력 과 자주 사용 하 는 문법,if,foreach 등 을 포함한다.preg 이용replace 함 수 는 템 플 릿 파일 을 교체 할 수 있 습 니 다.구체 적 인 상황 은 아래 와 같다. 

<!--    -->
{$data}
{foreach $vars}
 {if $V == 1 }
  <input value="{V}">
 {elseif $V == 2}
  <input value="123123">
 {else }
  <input value="sdfsas aa">
 {/if}
{/foreach}

{ loop $vars as $var}
 <input value="{var}">
{ /loop }
 //    
<?php echo $data; ?>
<?php foreach((array)$vars as $K=>$V) { ?>
 <?php if( $V == 1) { ?>
  <input value="<?php echo $V; ?>">
 <?php } elseif( $V == 2) { ?>
  <input value="123123">
 <?php } else { ?>
  <input value="sdfsas aa">
 <?php } ?>
<?php } ?>

<?php foreach((array)$vars as &$var) { ?>
 <input value="<?php echo $var; ?>">
<?php } ?>

컴 파일 류 의 작업 은 대체로 이 렇 습 니 다.나머지 include 와 JavaScript 에 대한 해석 은 모두 이와 대동소이 합 니 다.
그리고 템 플 릿 류. 

class Template {
 //      
 private $_arrayConfig = array(
  'root' => '',  //      
  'suffix' => '.html',  //       
  'template_dir' => 'templates',  //        
  'compile_dir' => 'templates_c',  //          
  'cache_dir' => 'cache',  //   html    
  'cache_htm' => false,  //        html  
  'suffix_cache' => '.htm',  //          
  'cache_time' => 7200,  //       
  'php_turn' => true,  //       php  
  'debug' => 'false',
 );
 private $_value = array();  
 private $_compileTool;  //    
 static private $_instance = null;  
 public $file;  //      
 public $debug = array();  //     
 
 public function __construct($array_config=array()) {}
 
 //         
 public function setConfig($key, $value=null) {}
 
 //       
 public function assign($key, $value) {}
 
 //       
 public function assignArray($array) {}
 
 //       
 public function needCache() {}
 
 //           
 public function reCache() {}
 
 //     
 public function show($file) {}
 
}
 
전체 템 플 릿 류 의 작업 절 차 는 템 플 릿 류 대상 을 예화 한 다음 에 assign 과 assignArray 방법 으로 템 플 릿 의 변 수 를 할당 한 다음 에 show 방법 을 호출 하여 템 플 릿 과 설정 파일 을 컴 파일 류 의 예화 대상 에 전송 한 다음 에 직접 include 컴 파일 된 pp,html 혼합 파일 로 출력 을 표시 하 는 것 입 니 다.간단 한 절 차 는 바로 이렇다.상세 한 코드 는 다음 과 같다. 

public function show($file) {
 $this->file = $file;
 if(!is_file($this->path())) {
  exit("          ");
 }

 $compile_file = $this->_arrayConfig['compile_dir']. md5($file). '.php';
 $cache_file = $this->_arrayConfig['cache_dir']. md5($file). $this->_arrayConfig['suffix_cache'];

 //           
 if($this->reCache($file) === false) {
  $this->_compileTool = new CompileClass($this->path(), $compile_file, $this->_arrayConfig);

  if($this->needCache()) {
   //       
   ob_start();
  }
  //              
  extract($this->_value, EXTR_OVERWRITE);

  if(!is_file($compile_file) or filemtime($compile_file) < filemtime($this->path())) {
   $this->_compileTool->vars = $this->_value;
   $this->_compileTool->compile();
   include($compile_file);
  }
  else {
   include($compile_file);
  }

  //            
  if($this->needCache() === true) {
   $message = ob_get_contents();
   file_put_contents($cache_file, $message);
  }
 }
 else {
  readfile($cache_file);
 }
}

쇼 방법 에서,나 는 먼저 템 플 릿 파일 의 존 재 를 판단 한 다음,MD5 인 코딩 을 이용 하여 컴 파일 파일 파일 과 캐 시 파일 의 파일 이름 을 생 성 한다.그 다음 에 컴 파일 이 필요 한 지 여 부 를 판단 하 는 것 입 니 다.컴 파일 파일 파일 이 존재 하 는 지,컴 파일 파일 파일 의 기록 시간 이 템 플 릿 파일 보다 적 는 지 판단 하 는 근거 입 니 다.컴 파일 이 필요 하 다 면 컴 파일 류 를 이용 하여 컴 파일 하여 phop 파일 을 만 듭 니 다.그리고 include 라 는 컴 파일 파일 파일 만 있 으 면 됩 니 다. 
템 플 릿 불 러 오 기 를 가속 화하 기 위해 서 컴 파일 된 파일 을 버퍼 에 출력 할 수 있 습 니 다.즉,ob 입 니 다.start()이 함 수 는 모든 출력 을 브 라 우 저 에 출력 하지 않 고 기본 버퍼 에 출력 합 니 다.ob 를 이용 합 니 다.get_contents()는 출력 을 읽 어서 정적 html 파일 로 저장 합 니 다. 
구체 적 인 사용 은 다음 과 같다. 

require('Template.php');

$config = array(
 'debug' => true,
 'cache_htm' => false,
 'debug' => true
);

$tpl = new Template($config);
$tpl->assign('data', microtime(true));
$tpl->assign('vars', array(1,2,3));
$tpl->assign('title', "hhhh");
$tpl->show('test');

 
 캐 시 된 파일 은 다음 과 같 습 니 다. 

<!DOCTYPE html>
<html>
 <head>
  <title>hhhh</title>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
 </head>
 <body>
  1466525760.32         <input value="1">
            <input value="123123">
            <input value="sdfsas aa">
       
     <input value="1">
     <input value="2">
     <input value="3">
    <script src="123?t=1465898652"></script>
 </body>
</html>
간단 한 사용자 정의 템 플 릿 엔진 이 완성 되 었 습 니 다.허름 하지만 사용 할 수 있 으 며 바퀴 를 만 드 는 즐거움 과 수확 에 중점 을 두 고 있 습 니 다. 
전체 코드 는 나의 것 을 볼 수 있다github
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기