假设我有这个数组:
$meta = array(
'name' => 'John Doe',
'age' => 16,
'e-mail' => 'john.doe@doedoe.com'
);
如何允许用户使用这些变量自定义布局? (并且能够发现错误)。这是我目前的想法:
extract($meta,EXTR_OVERWRITE);
$string = "Hi, I am $name. This is an $undefined_variable";
但它无法捕获未定义的变量。
答案 0 :(得分:3)
这个怎么样?
$string = "Hi, I am {{name}}. This is an {{undefined_variable}}";
foreach ($meta as $key => $value) {
$string = str_replace('{{' . $key . '}}', $value, $string);
}
或者,如果您可以将{{name}}
等直接作为$meta
中的键,则:
$string = "Hi, I am {{name}}. This is an {{undefined_variable}}";
$string = str_replace(array_keys($meta), array_values($meta), $string);
或者,您可以使用$meta
密钥创建和缓存{{...}}
,如果您不能将它们放在原始密钥中:
$metaTokens = array();
foreach ($meta as $key => $value) {
$metaTokens['{{' . $key . '}}'] = $value;
}
然后,如果你想简单地隐藏未定义的变量,那么现在你应该填写所有已定义的变量,因此{{..}}
中的任何其他内容都应该是一个未定义的变量:
$string = preg_replace('/{{.+?}}/', '', $string);
答案 1 :(得分:0)
您可以根据this article创建模板类(我尽量避免使用魔术方法):
class Template
{
protected $parameters = array();
protected $filename = null;
public function __construct( $filename )
{
$this->filename = $filename;
}
public function bind($name, $value)
{
$this->parameters[$name] = $value;
}
public function render()
{
extract( $this->parameters );
error_reporting(E_ALL ^ E_NOTICE);
ob_start();
include( $this->filename );
error_reporting(~0); // -1 do not work on OSX
return ob_get_clean();
}
}
基本上,您在渲染输出之前禁用警告,然后再次启用它们。即使某些变量尚未定义,也可以渲染文件。