写一个MVC的模板解析方法
MVC是模型(Model)、视图(View)和控制(Controller)的缩写,PHP中采用MVC模式的目的是实现Web系统的职能分工,通俗的说就是把业务逻辑处理从用户界面视图中分离出来。使Web系统的开发与维护更加方便,从而有效的节省人力物力,受到了越来越多企业的青睐。
模板引擎是MVC模式建立过程的重要方法,开发者可以设计一套赋予含义的标签,通过技术解析处理有效的把数据逻辑处理从界面模板中提取出来,通过解读标签的含义把控制权提交给相应业务逻辑处理程序,从而获取到需要的数据,以模板设计的形式展现出来,使设计人员能把精力更多放在表现形式上。下面是我对模板引擎的认识与设计方法:
说的好听些叫模板引擎,实际就是解读模板数据的过程(个人观点^^)。通过我对建站方面的思考认识,网站在展现形式上无非归纳为单条和多条两种形式,那么我们可以设定两种对应标签(如data、list)来处理这两种情况,关键点在于解决两种标签的多层相互嵌套问题,基本适合实现80%界面形式。
解读模板的方法有多种,常用的包括字符串处理(解决嵌套稍麻烦)、正则表达式。在这里我选用的正则表达式,下面是我的处理方法(本文仅提供思路和参考代码,可能不能直接使用)。
模板文件解析类:
<?php class Template { public $html, $vars, $bTag, $eTag; public $bFlag='{', $eFlag='}', $pfix='zmm:'; private $folder, $file; function __construct($vars=array()) { !empty($vars) && $this->vars = $vars; !empty($GLOBALS['cfg_tag_prefix']) && $this->pfix = $GLOBALS['cfg_tag_prefix'].':'; $this->bTag = $this->bFlag.$this->pfix; $this->eTag = $this->bFlag.'\/'.$this->pfix; empty(Tags::$vars) && Tags::$vars = &$this->vars; } public function LoadTpl($tpl) { $this->file = $this->GetTplPath($tpl); Tags::$file = &$this->file; if (is_file($this->file)) { if ($this->GetTplHtml()) { $this->SetTplTags(); } else { exit('模板文件加载失败!'); } } else { exit('模板文件['.$this->file.']不存在!'); } } private function GetTplPath($tpl) { $this->folder = WEBSITE_DIRROOT. $GLOBALS['cfg_tpl_root']; return $this->folder.'/'.$tpl; } private function GetTplHtml() { $html = self::FmtTplHtml(file_get_contents($this->file)); if (!empty($html)) { $callFunc = Tags::$prefix.'Syntax'; $this->html = Tags::$callFunc($html, new Template()); } else { exit('模板文件内容为空!'); } return true; } static public function FmtTplHtml($html) { return preg_replace('/(\r)|(\n)|(\t)|(\s{2,})/is', '', $html); } public function Register($vars=array()) { if (is_array($vars)) { $this->vars = $vars; Tags::$vars = &$this->vars; } } public function Display($bool=false, $name="", $time=0) { if (!empty($this->html)) { if ($bool && !empty($name)) { if (!is_int($time)) $time = 600; $cache = new Cache($time); $cache->Set($name, $this->html); } echo $this->html; flush(); } else { exit('模板文件内容为空!'); } } public function SetAssign($souc, $info) { if (!empty($this->html)) { $this->html = str_ireplace($souc, self::FmtTplHtml($info), $this->html); } else { exit('模板文件内容为空!'); } } private function SetTplTags() { $this->SetPanelTags(); $this->SetTrunkTags(); $this->RegHatchVars(); } private function SetPanelTags() { $rule = $this->bTag.'([^'.$this->eFlag.']+)\/'.$this->eFlag; preg_match_all('/'.$rule.'/ism', $this->html, $out_matches); $this->TransTag($out_matches, 'panel'); unset($out_matches); } private function SetTrunkTags() { $rule = $this->bTag.'(\w+)\s*([^'.$this->eFlag.']*?)'.$this->eFlag. '((?:(?!'.$this->bTag.')[\S\s]*?|(?R))*)'.$this->eTag.'\\1\s*'.$this->eFlag; preg_match_all('/'.$rule.'/ism', $this->html, $out_matches); $this->TransTag($out_matches, 'trunk'); unset($out_matches); } private function TransTag($result, $type) { if (!empty($result[0])) { switch ($type) { case 'panel' : { for ($i = 0; $i < count($result[0]); $i ++) { $strTag = explode(' ', $result[1][$i], 2); if (strpos($strTag[0], '.')) { $itemArg = explode('.', $result[1][$i], 2); $callFunc = Tags::$prefix.ucfirst($itemArg[0]); if (method_exists('Tags', $callFunc)) { $html = Tags::$callFunc(chop($itemArg[1])); if ($html !== false) { $this->html = str_ireplace($result[0][$i], $html, $this->html); } } } else { $rule = '^([^\s]+)\s*([\S\s]+)$'; preg_match_all('/'.$rule.'/is', trim($result[1][$i]), $tmp_matches); $callFunc = Tags::$prefix.ucfirst($tmp_matches[1][0]); if (method_exists('Tags', $callFunc)) { $html = Tags::$callFunc($tmp_matches[2][0]); if ($html !== false) { $this->html = str_ireplace($result[0][$i], $html, $this->html); } } unset($tmp_matches); } } break; } case 'trunk' : { for ($i = 0; $i < count($result[0]); $i ++) { $callFunc = Tags::$prefix.ucfirst($result[1][$i]); if (method_exists('Tags', $callFunc)) { $html = Tags::$callFunc($result[2][$i], $result[3][$i]); $this->html = str_ireplace($result[0][$i], $html, $this->html); } } break; } default: break; } } else { return false; } } private function RegHatchVars() { $this->SetPanelTags(); } function __destruct() {} } ?>
标签解析类:(目前暂时提供data、list两种标签的解析,说明思路)
<?php class Tags { static private $attrs=null; static public $file, $vars, $rule, $prefix='TAG_'; static public function TAG_Syntax($html, $that) { $rule = $that->bTag.'if\s+([^'.$that->eFlag.']+)\s*'.$that->eFlag; $html = preg_replace('/'.$rule.'/ism', '<?php if (\\1) { ?>', $html); $rule = $that->bTag.'elseif\s+([^'.$that->eFlag.']+)\s*'.$that->eFlag; $html = preg_replace('/'.$rule.'/ism', '<?php } elseif (\\1) { ?>', $html); $rule = $that->bTag.'else\s*'.$that->eFlag; $html = preg_replace('/'.$rule.'/ism', '<?php } else { ?>', $html); $rule = $that->bTag.'loop\s+(\S+)\s+(\S+)\s*'.$that->eFlag; $html = preg_replace('/'.$rule.'/ism', '<?php foreach (\\1 as \\2) { ?>', $html); $rule = $that->bTag.'loop\s+(\S+)\s+(\S+)\s+(\S+)\s*'.$that->eFlag; $html = preg_replace('/'.$rule.'/ism', '<?php foreach (\\1 as \\2 => \\3) { ?>', $html); $rule = $that->eTag.'(if|loop)\s*'.$that->eFlag; $html = preg_replace('/'.$rule.'/ism', '<?php } ?>', $html); $rule = $that->bTag.'php\s*'.$that->eFlag.'((?:(?!'. $that->bTag.')[\S\s]*?|(?R))*)'.$that->eTag.'php\s*'.$that->eFlag; $html = preg_replace('/'.$rule.'/ism', '<?php \\1 ?>', $html); return self::TAG_Execute($html); } static public function TAG_List($attr, $html) { if (!empty($html)) { if (self::TAG_HaveTag($html)) { return self::TAG_DealTag($attr, $html, true); } else { return self::TAG_GetData($attr, $html, true); } } else { exit('标签{list}的内容为空!'); } } static public function TAG_Data($attr, $html) { if (!empty($html)) { if (self::TAG_HaveTag($html)) { return self::TAG_DealTag($attr, $html, false); } else { return self::TAG_GetData($attr, $html, false); } } else { exit('标签{data}的内容为空!'); } } static public function TAG_Execute($html) { ob_clean(); ob_start(); if (!empty(self::$vars)) { is_array(self::$vars) && extract(self::$vars, EXTR_OVERWRITE); } $file_inc = WEBSITE_DIRINC.'/buffer/'. md5(uniqid(rand(), true)).'.php'; if ($fp = fopen($file_inc, 'xb')) { fwrite($fp, $html); if (fclose($fp)) { include($file_inc); $html = ob_get_contents(); } unset($fp); } else { exit('模板解析文件生成失败!'); } ob_end_clean(); @unlink($file_inc); return $html; } static private function TAG_HaveTag($html) { $bool_has = false; $tpl_ins = new Template(); self::$rule = $tpl_ins->bTag.'([^'.$tpl_ins->eFlag.']+)\/'.$tpl_ins->eFlag; $bool_has = $bool_has || preg_match('/'.self::$rule.'/ism', $html); self::$rule = $tpl_ins->bTag.'(\w+)\s*([^'.$tpl_ins->eFlag.']*?)'.$tpl_ins->eFlag. '((?:(?!'.$tpl_ins->bTag.')[\S\s]*?|(?R))*)'.$tpl_ins->eTag.'\\1\s*'.$tpl_ins->eFlag; $bool_has = $bool_has || preg_match('/'.self::$rule.'/ism', $html); unset($tpl_ins); return $bool_has; } static private function TAG_DealTag($attr, $html, $list) { preg_match_all('/'.self::$rule.'/ism', $html, $out_matches); if (!empty($out_matches[0])) { $child_node = array(); for ($i = 0; $i < count($out_matches[0]); $i ++) { $child_node[] = $out_matches[3][$i]; $html = str_ireplace($out_matches[3][$i], '{-->>child_node_'.$i.'<<--}', $html); } $html = self::TAG_GetData($attr, $html, $list); for ($i = 0; $i < count($out_matches[0]); $i ++) { $html = str_ireplace('{-->>child_node_'.$i.'<<--}', $child_node[$i], $html); } preg_match_all('/'.self::$rule.'/ism', $html, $tmp_matches); if (!empty($tmp_matches[0])) { for ($i = 0; $i < count($tmp_matches[0]); $i ++) { $callFunc = self::$prefix.ucfirst($tmp_matches[1][$i]); if (method_exists('Tags', $callFunc)) { $temp = self::$callFunc($tmp_matches[2][$i], $tmp_matches[3][$i]); $html = str_ireplace($tmp_matches[0][$i], $temp, $html); } } } unset($tmp_matches); } unset($out_matches); return $html; } static private function TAG_GetData($attr, $html, $list=false) { if (!empty($attr)) { $attr_ins = new Attbt($attr); $attr_arr = $attr_ins->attrs; if (is_array($attr_arr)) { extract($attr_arr, EXTR_OVERWRITE); $source = table_name($source, $column); $rule = '\[field:\s*(\w+)\s*([^\]]*?)\s*\/?]'; preg_match_all('/'.$rule.'/is', $html, $out_matches); $data_str = ''; $data_ins = new DataSql(); $attr_where = $attr_order = ''; if (!empty($where)) { $where = str_replace(',', ' and ', $where); $attr_where = ' where '. $where; } if (!empty($order)) { $attr_order = ' order by '.$order; } else { $fed_name = ''; $fed_ins = $data_ins->GetFedNeedle($source); $fed_cnt = $data_ins->GetFedCount($fed_ins); for ($i = 0; $i < $fed_cnt; $i ++) { $fed_flag = $data_ins->GetFedFlag($fed_ins, $i); if (preg_match('/auto_increment/ism', $fed_flag)) { $fed_name = $data_ins->GetFedName($fed_ins, $i); break; } } if (!empty($fed_name)) $attr_order = ' order by '.$fed_name.' desc'; } if ($list == true) { if (empty($source) && empty($sql)) { exit('标签{list}必须指定source属性!'); } $attr_rows = $attr_page = ''; if ($rows > 0) { $attr_rows = ' limit 0,'.$rows; } if (!empty($sql)) { $data_sql = $sql; } else { $data_sql = 'select * from `'.$source.'`'. $attr_where.$attr_order.$attr_rows; } if ($pages=='true' && !empty($size)) { $data_num = $data_ins->GetRecNum($data_sql); $page_cnt = ceil($data_num / $size); global $page; if (!isset($page) || $page < 1) $page = 1; if ($page > $page_cnt) $page = $page_cnt; $data_sql = 'select * from `'.$source.'`'.$attr_where. $attr_order.' limit '.($page-1) * $size.','.$size; $GLOBALS['cfg_page_curr'] = $page; $GLOBALS['cfg_page_prev'] = $page - 1; $GLOBALS['cfg_page_next'] = $page + 1; $GLOBALS['cfg_page_nums'] = $page_cnt; if (function_exists('list_pagelink')) { $GLOBALS['cfg_page_list'] = list_pagelink($page, $page_cnt, 2); } } $data_idx = 0; $data_ret = $data_ins->SqlCmdExec($data_sql); while ($row = $data_ins->GetRecArr($data_ret)) { if ($skip > 0 && !empty($flag)) { $data_idx != 0 && $data_idx % $skip == 0 && $data_str .= $flag; } $data_tmp = $html; $data_tmp = str_ireplace('@idx', $data_idx, $data_tmp); for ($i = 0; $i < count($out_matches[0]); $i ++) { $data_tmp = str_ireplace($out_matches[0][$i], $row[$out_matches[1][$i]], $data_tmp); } $data_str .= $data_tmp; $data_idx ++; } } else { if (empty($source)) { exit('标签{data}必须指定source属性!'); } $data_sql = 'select * from `'.$source. '`'.$attr_where.$attr_order; $row = $data_ins->GetOneRec($data_sql); if (is_array($row)) { $data_tmp = $html; for ($i = 0; $i < count($out_matches[0]); $i ++) { $data_val = $row[$out_matches[1][$i]]; if (empty($out_matches[2][$i])) { $data_tmp = str_ireplace($out_matches[0][$i], $data_val, $data_tmp); } else { $attr_str = $out_matches[2][$i]; $attr_ins = new Attbt($attr_str); $func_txt = $attr_ins->attrs['function']; if (!empty($func_txt)) { $func_tmp = explode('(', $func_txt); if (function_exists($func_tmp[0])) { eval('$func_ret ='.str_ireplace('@me', '\''.$data_val.'\'', $func_txt)); $data_tmp = str_ireplace($out_matches[0][$i], $func_ret, $data_tmp); } else { exit('调用了不存在的函数!'); } } else { exit('标签设置属性无效!'); } } } $data_str .= $data_tmp; } } unset($data_ins); return $data_str; } else { exit('标签设置属性无效!'); } } else { exit('没有设置标签属性!'); } } static public function __callStatic($name, $args) { exit('标签{'.$name.'}不存在!'); } } ?>

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds





Introduction Dans le monde numérique en évolution rapide d'aujourd'hui, il est crucial de créer des applications WEB robustes, flexibles et maintenables. L'architecture PHPmvc fournit une solution idéale pour atteindre cet objectif. MVC (Model-View-Controller) est un modèle de conception largement utilisé qui sépare les différents aspects d'une application en composants indépendants. Les fondements de l'architecture MVC Le principe fondamental de l'architecture MVC est la séparation des préoccupations : Modèle : encapsule les données et la logique métier de l'application. Vue : responsable de la présentation des données et de la gestion des interactions des utilisateurs. Contrôleur : coordonne l'interaction entre les modèles et les vues, gère les demandes des utilisateurs et la logique métier. Architecture PHPMVC L'architecture phpMVC suit le modèle MVC traditionnel mais introduit également des fonctionnalités spécifiques au langage. Ce qui suit est PHPMVC

L'architecture MVC (Model-View-Controller) est l'un des modèles les plus populaires dans le développement PHP car elle fournit une structure claire pour organiser le code et simplifier le développement d'applications WEB. Bien que les principes de base de MVC soient suffisants pour la plupart des applications Web, ils présentent certaines limites pour les applications qui doivent gérer des données complexes ou implémenter des fonctionnalités avancées. Séparation de la couche modèle La séparation de la couche modèle est une technique courante dans l'architecture MVC avancée. Cela implique de diviser une classe de modèle en sous-classes plus petites, chacune se concentrant sur une fonctionnalité spécifique. Par exemple, pour une application de commerce électronique, vous pouvez diviser la classe de modèle principale en un modèle de commande, un modèle de produit et un modèle client. Cette séparation contribue à améliorer la maintenabilité et la réutilisation du code. Utiliser l'injection de dépendances

Le framework SpringMVC décrypté : Pourquoi est-il si populaire, des exemples de code spécifiques sont nécessaires Introduction : Dans le domaine actuel du développement logiciel, le framework SpringMVC est devenu un choix très populaire parmi les développeurs. Il s'agit d'un framework Web basé sur le modèle d'architecture MVC, offrant une méthode de développement flexible, légère et efficace. Cet article approfondira le charme du framework SpringMVC et démontrera sa puissance à travers des exemples de code spécifiques. 1. Avantages de SpringMVC Framework Méthode de configuration flexible Spr

Le modèle MVC (Model-View-Controller) est un modèle de conception logicielle couramment utilisé qui peut aider les développeurs à mieux organiser et gérer le code. Le modèle MVC divise l'application en trois parties : Modèle, Vue et Contrôleur, chaque partie a son propre rôle et ses propres responsabilités. Dans cet article, nous verrons comment implémenter le modèle MVC à l'aide de PHP. Modèle Un modèle représente les données et le traitement des données d'une application. en général,

Développement de MVC avec le framework PHP8 : concepts et techniques importants que les débutants doivent connaître Introduction : Avec le développement rapide d'Internet, le développement Web joue un rôle important dans l'industrie actuelle du développement de logiciels. PHP est largement utilisé pour le développement Web et il existe de nombreux frameworks matures qui aident les développeurs à créer des applications plus efficacement. Parmi eux, l’architecture MVC (Model-View-Controller) est l’un des modèles les plus courants et les plus utilisés. Cet article présentera comment les débutants peuvent utiliser le framework PHP8 pour développer des applications MVC.

Comment implémenter une architecture MVC évolutive dans le framework PHP8 Introduction : Avec le développement rapide d'Internet, de plus en plus de sites Web et d'applications adoptent le modèle d'architecture MVC (Model-View-Controller). L'objectif principal de l'architecture MVC est de séparer les différentes parties de l'application afin d'améliorer la maintenabilité et l'évolutivité du code. Dans cet article, nous présenterons comment implémenter une architecture MVC évolutive dans le framework PHP8. 1. Comprendre le modèle d'architecture MVC Le modèle d'architecture MVC est une conception logicielle.

Dans le développement Web, MVC (Model-View-Controller) est un modèle architectural couramment utilisé pour traiter et gérer les données, l'interface utilisateur et la logique de contrôle d'une application. En tant que langage de développement Web populaire, PHP peut également utiliser l'architecture MVC pour concevoir et créer des applications Web. Cet article présentera comment utiliser l'architecture MVC pour concevoir des projets en PHP, et expliquera ses avantages et ses précautions. Qu'est-ce que MVCMVC est un modèle d'architecture logicielle couramment utilisé dans les applications Web. VM

Développement de MVC avec le framework PHP8 : un guide étape par étape Introduction : MVC (Model-View-Controller) est un modèle d'architecture logicielle couramment utilisé pour séparer la logique, les données et l'interface utilisateur d'une application. Il fournit une structure qui sépare l'application en trois composants distincts pour une meilleure gestion et maintenance du code. Dans cet article, nous explorerons comment utiliser le framework PHP8 pour développer une application conforme au modèle MVC. Première étape : comprendre le modèle MVC Avant de commencer à développer une application MVC, je
