1

我有自己的模板类。在这堂课中,我将字符串替换{NEXT_PAGE}

<?php echo $tpl->vars["NEXT_PAGE"]; ?>

但有时会发生,该索引不存在。

我发现主题PHP: is_array on $arr['key'] with non existing 'key'并且我知道如何检查是否存在某些索引。

我的问题是,有什么更好的方法来提高性能。

  1. 始终检查索引是否存在,如果存在,则打印它
  2. 只需打印它而不检查索引是否存在。

第一个解决方案很棒,没有警告,没有错误,没有通知,但是我通过数组两次,第一次检查它,第二次打印它。需要更多的 CPU 时间。

第二种解决方案只是尝试找到它,如果它存在则打印它,否则打​​印空字符串,这对我来说没问题,并且我可以通过禁用警告error_reporting


那么什么更好呢?我认为第二种解决方案是禁用警告。PHP总是必须检查索引是否存在,但是当我也检查它时,它会检查两次。我对吗?

需要明确的是,访问不存在的索引最多占所有访问该数组的 3%。


示例 我有一个表单,如果 pass 不正确,我会在其中放回登录名。当我替换为时{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 发送的登录名,然后字段不为空。

4

4 回答 4

3

您当前正在循环通过文件中的模式匹配,然后将匹配替换为相应的模板 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将包含一个您写入缓存的字符串。原理是一样的。

于 2013-05-31T11:29:12.363 回答
1

您的系统性能至关重要吗?您每秒将执行多少次查找?

关于 isset() 如何比 array_key_exists() 更快的帖子。 http://ilia.ws/archives/247-Performance-Analysis-of-isset-vs-array_key_exists.html

想想在设计方面在数组中有或没有这个键意味着什么。它应该一直在那里吗?模型在每种情况下都有效吗?

我目前的理解是需要查找。

于 2013-05-31T11:31:07.533 回答
0

您可以将 @ 放在 echo 语句之前,这将抑制任何错误。可能还有其他编写模板引擎的方法不需要以这种方式访问​​数组(可能使用自定义对象或 extract() 函数),但 @ 技巧在这里似乎最简单。

于 2013-05-31T11:19:44.657 回答
0

您可以使用 isset 函数检查变量的索引是否存在:

if (isset($tpl->vars["NEXT_PAGE"]))
{
}
于 2013-05-31T11:22:28.600 回答