我有自己的模板类。在本课程中,我将字符串{NEXT_PAGE}
替换为
<?php echo $tpl->vars["NEXT_PAGE"]; ?>
但有时会发生,这个指数不存在。
我找到了主题PHP: is_array on $arr['key'] with non existing 'key',我知道如何检查某个索引是否存在。
我的问题是,提高绩效有什么好处。
第一个解决方案很棒,没有警告,没有错误,没有通知,但我经历了两次,第一次检查,第二次打印。需要更多的CPU时间。
第二个解决方案只是尝试找到它,如果它存在则打印它,否则打印空字符串,对我来说没关系,我可以通过error_reporting
那么更好的是什么?我认为第二个解决方案是禁用警告。 PHP总是要检查索引是否存在,但是当我检查索引时,它会被检查两次。我是对的吗?
为了清楚起见,访问不存在的索引是访问此数组的最多3%。
示例
我有一个表单,如果传递不正确,我会放回登录名。
当我用{LOGIN_NAME}
替换<?php echo $tpl->vars["LOGIN_NAME"]; ?>
时,我将这个新文件保存为PHP脚本,所以稍后我只是运行它,不再替换!
所以我的编译脚本是这样的
<form ...>
<input type="login" ... value="<?php echo $tpl->vars["LOGIN_NAME"] ?>" />
(pass etc...)
</form>
因此,当有人第一次访问此页面时没有设置LOGIN_NAME,PHP无法打印任何内容,但是没关系,字段仍为空。如果表单已发送,则脚本添加到LOGIN_NAME发送登录名,然后字段不为空。
答案 0 :(得分:2)
您正在循环浏览文件中的模式匹配,然后将匹配替换为相应的模板var(如果已设置)。
你为什么不从另一方面解决问题?
循环模板变量并替换文件中的模式匹配。然后,将剩余的模式匹配替换为空字符串。
foreach ($tpl->vars as $key => $val) {
$template = str_replace("{$key}", $val, $template);
}
$template = preg_replace('/{(.+?)}/', '', $template);
更新:由于您要将php字符串写入模板而不是实际值,因此代码如下所示:
foreach ($tpl->vars as $key => $val) {
$template = str_replace("{$key}", "<?php echo \$tpl->vars['$key']; ?>", $template);
}
$template = preg_replace('/{(.+?)}/', '', $template);
然后$template
将包含您写入缓存的字符串。原则是一样的。
答案 1 :(得分:1)
您的系统性能是否至关重要?你每秒会执行多少次查找?
有关isset()如何比array_key_exists()更快的帖子。 http://ilia.ws/archives/247-Performance-Analysis-of-isset-vs-array_key_exists.html
考虑一下设计在数组中是否拥有此键意味着什么。它应该永远存在吗?模型在每种情况下都有效吗?
我目前的理解是需要查找。
答案 2 :(得分:0)
你可以把@放在你的echo语句前面,这会抑制任何错误。可能还有其他方法编写模板引擎,不需要以这种方式访问数组(可能使用自定义对象,或者使用extract()函数),但@ trick似乎最简单。
答案 3 :(得分:0)
您可以使用isset函数检查变量的索引是否存在:
if (isset($tpl->vars["NEXT_PAGE"]))
{
}