간단 한 사용자 정의 php 템 플 릿 엔진
웹 엔 드 에서 모델 층 이 데이터베이스 로 작 동 합 니 다.보기 층 은 템 플 릿,즉 웹 전단 입 니 다.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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.