目前正在开发一个“简单”的模板类,问题是如何在不使用 eval 的情况下在字符串中执行 PHP 代码?
以下示例是我的模板类的工作原理:
$user = 'Dave';
ob_start();
include 'index.tpl';
$content = ob_get_clean(); // String
$pattern = sprintf('/%s\s*(.+?)\s*%s/s', '{{', '}}'); // replace with php tags
$new_content = preg_replace($pattern, '<?php echo $1; ?>', $content);
echo $new_content;
index.tpl
<html>
<head></head>
<body>
Hello {{ $user }}!
</body>
</html>
我得到以下结果:
Hello !
我不想使用 eval,因为它的使用速度又慢又糟糕,还有其他方法吗? laravel 刀片引擎不使用 eval 所以必须有。
您不需要执行 PHP 代码。您将
{{ $user }}
替换为不再执行的 PHP 代码。所以你的 HTML 将在替换后看起来像这样:
<?php echo "Dave" ?>
您的浏览器认为
<?...>
是一个 HTML 标签,因此不会显示正确的名称。
解决方案: 只需将
{{ $user }}
替换为Dave,为什么要添加更多PHP代码?
我建议你给变量赋值时,应该像这样把它作为一个全局变量;
$GLOBALS['My_Vars']['VarName'] = $Value;
当您从示例 $user 中的代码中检索变量的名称时,您将
{{ $user }}
更改为 $GLOBALS['My_Vars']['user']
中的值
在这种情况下你不需要使用 evel