当前位置: 首页 > 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.jsqmd.com/news/981792/

相关文章:

  • NXP K20热阻参数更新解析:从8°C/W到9°C/W的工程实践
  • 经营分析会怎么开?终于有人把经营分析会讲清楚了!
  • 2026全国塑胶模具优质服务商 TOP5 宏晶佳一站式解决方案受行业认可 - 深度智识库
  • Minecraft 1.21 MASA全家桶汉化包终极指南:从语言障碍到无障碍创作
  • 2026广西黄金回收白银回收铂金回收真实测评+高口碑实体店铺地址电话 - 信誉隆金银铂奢回收
  • 2026最新的 国内以及河北地区四氟弹性带生产厂家实力排行及采购参考 四氟弹性带 - 奔跑123
  • 如何快速获取网盘直链:开源下载助手LinkSwift使用全攻略 [特殊字符]
  • fuzzy.js高级用例:实现智能搜索建议和自动补全功能
  • 遗传算法进阶实战:破解早熟、调参与收敛诊断
  • PHP框架核心运行原理解析
  • 3分钟搞定Adobe插件安装:ZXPInstaller终极免费方案
  • Kinetis K21 I2S引脚复用配置:从原理到工程实践详解
  • 241张牧场实拍牛只图像,带VOC XML和YOLO TXT双格式标注文件
  • 2026抚州黄金回收白银回收铂金回收真实测评+高口碑实体店铺地址电话 - 信誉隆金银铂奢回收
  • K60微控制器引脚复用与封装选型:从原理到硬件设计的实战指南
  • 2026抚州黄金回收白银回收铂金回收 地址联系大全+支持现场结算无套路 - 诚金汇钻回收公司
  • LucidDreamer商业应用:如何将文本到3D技术应用于游戏、影视和元宇宙
  • BaiduPCS-Web:完全免费的百度网盘下载加速解决方案终极指南
  • AI时代First-Time-Right代码生成:三层防御性提示工程实践
  • 浏览器操控双雄对决:Claude Code bb‑browser 与 agent‑browser 完全指南
  • 索尼相机终极解锁指南:如何安全解除系统限制并释放隐藏功能
  • 阻垢剂生产商推荐:宝莱尔如何用特殊化学品定义高效 - 品牌推荐大师
  • RMQTT Broker性能优化技巧:提升5G IoT设备消息吞吐量的10个关键策略
  • 2026年高灵敏度/稳定性好/半自动检定装置售后比较好的企业怎么选择? - 品牌推荐大师
  • VR视频转换终极教程:如何用免费工具让VR视频在普通设备上播放
  • macOS Windows应用兼容性解决方案深度解析:Whisky技术架构与实践指南
  • Go 微服务熔断与限流:从 Sentinel 适配到自适应过载保护
  • VSA公差分析实操——从模型导入到输出报告的完整流程
  • 深入解析MCU引脚复用与封装设计:以K10系列为例的硬件实战指南
  • 2026北海黄金回收白银回收铂金哪里回收? 高口碑实体店铺地址电话 - 中安检金银铂钻回收