问题
我想以与扩展双引号字符串中的变量相同的方式扩展字符串中的变量。
$string = '<p>It took $replace s</>';
$replace = 40;
expression_i_look_for;
$string
应该成为'<p>It took 40 s</>';
我看到一个明显的解决方案是这样的:
$string = str_replace('"', '\"', $string);
eval('$string = "$string";');
但我真的不喜欢它,因为 eval() 是不安全的。有没有其他方法可以做到这一点?
语境
我正在构建一个简单的模板引擎,这就是我需要的地方。
示例模板 (view_file.php)
<h1>$title</h1>
<p>$content</p>
模板渲染(简化代码):
$params = array('title' => ...);
function render($view_file, $params)
extract($params)
ob_start();
include($view_file);
$text = ob_get_contents();
ob_end_clean();
expression_i_look_for; // this will expand the variables in the template
return $text;
}
模板中变量的扩展简化了它的语法。没有它,上面的示例模板将是:
<h1><?php echo $title;?></h1>
<p><?php echo $content;?></p>
你觉得这种方法好吗?还是我应该往另一个方向看?
编辑
最后我明白,由于 PHP 扩展变量的灵活方式(即使${$var}->member[0]
是有效的),没有简单的解决方案。
所以只有两种选择:
- 采用现有的成熟模板系统
- 坚持一些非常基本的东西,基本上仅限于通过
include
.