当前位置: 首页 > news >正文

PHP模板引擎与视图渲染

PHP模板引擎与视图渲染

PHP本身就是模板语言。但为了更好分离视图和业务逻辑,各种模板引擎应运而生。今天说说PHP模板引擎的简单实现。

一个简单的模板引擎。

```php
class SimpleTemplate
{
private string $templateDir;
private string $cacheDir;

public function __construct(string $templateDir, string $cacheDir = '/tmp/views')
{
$this->templateDir = rtrim($templateDir, '/');
$this->cacheDir = rtrim($cacheDir, '/');
if (!is_dir($this->cacheDir)) mkdir($this->cacheDir, 0755, true);
}

public function render(string $template, array $data = []): string
{
$cacheFile = $this->cacheDir . '/' . md5($template) . '.php';

if (!file_exists($cacheFile)) {
$compiled = $this->compile($template);
file_put_contents($cacheFile, $compiled);
}

extract($data);
ob_start();
include $cacheFile;
return ob_get_clean();
}

public function compile(string $template): string
{
$content = file_get_contents($this->templateDir . '/' . $template . '.html');

$content = preg_replace('/\{\{(.+?)\}\}/', '', $content);
$content = preg_replace('/@if\((.+?)\)/', '', $content);
$content = preg_replace('/@else/', '', $content);
$content = preg_replace('/@endif/', '', $content);
$content = preg_replace('/@foreach\((.+?)\)/', '', $content);
$content = preg_replace('/@endforeach/', '', $content);
$content = preg_replace('/@php\((.+?)\)/', '', $content);

return $content;
}
}
?>


{{ $name }}的个人资料

邮箱: {{ $email }}


@if(!empty($bio))

简介: {{ $bio }}


@endif

技能


  • @foreach($skills as $skill)

  • {{ $skill }}

  • @endforeach



$engine = new SimpleTemplate(__DIR__ . '/templates');
echo $engine->render('user', [
'name' => '张三',
'email' => 'test@test.com',
'bio' => 'PHP开发者',
'skills' => ['PHP', 'JavaScript', 'MySQL'],
]);
?>

模板编译缓存提升性能。把模板编译成PHP代码缓存起来,后续直接执行缓存的PHP文件,不需要重新解析模板。

```php
// 编译缓存
class TemplateCache
{
private string $cacheDir;

public function __construct(string $cacheDir = '/tmp/views_cache')
{
$this->cacheDir = rtrim($cacheDir, '/');
if (!is_dir($this->cacheDir)) mkdir($this->cacheDir, 0755, true);
}

public function load(string $template, array $data, callable $renderFn): string
{
$cacheKey = md5($template . serialize($data));
$cacheFile = $this->cacheDir . '/' . $cacheKey . '.html';

if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < 3600) {
return file_get_contents($cacheFile);
}

$content = $renderFn($data);
file_put_contents($cacheFile, $content);
return $content;
}
}
?>

模板引擎的核心是变量替换和模板继承。Blade、Twig这些成熟的模板引擎还支持布局、组件、指令等功能。自己做模板引擎主要是为了理解原理,生产环境建议用成熟的模板引擎。

http://www.gsyq.cn/news/1493528.html

相关文章:

  • 2026广西黄金回收白银回收铂金回收真实测评+高口碑实体店铺地址电话 - 信誉隆金银铂奢回收
  • Minecraft 1.21 MASA全家桶汉化包终极指南:从语言障碍到无障碍创作
  • 遗传算法进阶实战:破解早熟、调参与收敛诊断
  • Kinetis K21 I2S引脚复用配置:从原理到工程实践详解
  • fuzzy.js高级用例:实现智能搜索建议和自动补全功能
  • K60微控制器引脚复用与封装选型:从原理到硬件设计的实战指南
  • AI时代First-Time-Right代码生成:三层防御性提示工程实践
  • 浏览器操控双雄对决:Claude Code bb‑browser 与 agent‑browser 完全指南
  • BaiduPCS-Web:完全免费的百度网盘下载加速解决方案终极指南
  • 2026年高灵敏度/稳定性好/半自动检定装置售后比较好的企业怎么选择? - 品牌推荐大师
  • 2026北海黄金回收白银回收铂金哪里回收? 高口碑实体店铺地址电话 - 中安检金银铂钻回收
  • LMDrive模型训练终极教程:视觉编码器预训练与指令微调
  • 多显示器亮度管理困境的优雅解决方案:Monitorian技术深度解析
  • 从网卡Offload到队列调优:一套完整的Linux网络性能调优实战指南(含ethtool命令详解)
  • i.MX 8ULP电源与时钟系统深度解析:从架构原理到低功耗设计实践
  • 如何用RPFM高效开发Total War模组:5个实用技巧让你事半功倍
  • 别再只把Flink当流处理了:从电商实时数仓到风控,聊聊它的三大核心应用场景
  • 2026东莞黄金回收白银回收铂金回收多少钱一克 本地靠谱商家整理5 家实体门店 - 中业金奢再生回收中心
  • MsgViewer:跨平台邮件格式兼容的终极解决方案
  • 零元购火山方舟 Agent Plan:AI 编程、Agent 开发者这波别错过
  • 032、Plan Mode 实战:复杂任务先规划再实施,架构决策与方案评审流程
  • 上海爱马仕包包回收榜单|2026夏季热门款变现渠道权威推荐 - 禹竞
  • 微信视频号直播数据抓取完整教程:3步实现弹幕礼物实时监控
  • NXP K53 MCU外设电气规格实战解析:从参数表到可靠设计
  • 2026年湖南胶粘剂厂家全品类采购指南:从石材干挂到工业代工的源头工厂对标 - 企业名录优选推荐
  • 2026年最新实用英语作文批改工具推荐 学生党闭眼入不踩坑
  • 擅长制造业的猎头公司有哪些?实测后我只推荐这一家(南方新华) - 榜单推荐
  • 如何在Apple Silicon Mac上构建跨架构Windows应用兼容层
  • 2026无锡德尔沃包包回收无保卡可售?正规渠道与变现攻略 - 开心测评
  • 突破Cursor AI试用限制的完全免费终极方案:身份切换引擎深度解析