我有一个函数可以循环从MySQL中提取的不同类型的列表,并将它们显示为Facebook风格的“提要”。每种类型的商品都有不同的外观,因此需要不同的模板。
以下功能示例可能被调用100次(如果有100个列表):
function display_listing($id,$type) {
global $abs_path;
switch($type) {
case 'photo':
include($abs_path . '/templates/photo.php');
break;
case 'video':
include($abs_path . '/templates/video.php');
break;
}
}
有没有更好的方法来做到这一点,我不会最终得到100个包含 - 这可能会减慢我的进程速度?我可以以某种方式在页面上保存一次包含,并根据需要多次引用它吗?
......或者这是最好的做法吗?
此外,我想知道如何在没有模板引擎的情况下自行完成此操作......
编辑:问题不仅仅是由include_once解决(我不相信)......我需要能够多次重用包含的文件,每次都替换变量。
答案 0 :(得分:2)
虽然交换机不是编写此代码的最具扩展性的方式,但我担心包含是将模板保存在单独文件中的唯一方法。
可以想象,您可以将每个模板的代码封装在一个函数中,但是:
/*
photoTemplate.php
*/
<?php
function loadPhotoTemplate($id) {
?>
<div id="photo">
...
</div>
<?php
}
?>
/*
listing.php
*/
function display_listing($id,$type) {
global $abs_path;
switch($type) {
case 'photo':
include_once($abs_path . '/templates/photo.php');
loadPhotoTemplate($id);
break;
case 'video':
include_once($abs_path . '/templates/video.php');
loadVideoTemplate($id);
break;
}
}
这将最多加载每个模板文件一次,然后每次要显示包含该项目特定数据的模板时调用该函数。
修改强>
最好在开头包含所有模板文件,然后只需在交换机中调用相应的函数即可。 PHP的* _once()函数很慢,因为每次调用它们时都必须查阅以前包含/必需的文件列表。
答案 1 :(得分:1)
创建一组允许的模板。你有功能看看请求的模板是否在数组中。如果是,则使用$ type变量来包含该文件。是的,一般情况下,您不应该在包含文件名中使用用户提供的数据,但是因为您已经根据已知良好的数组值对其进行了验证,所以它是安全的。
答案 2 :(得分:1)
如果你担心的是表现,我个人根本不会进入这个循环。
假设列表中的项目比它们创建的频率更高,我会在创建项目时生成HTML,并将输出与数据一起存储在数据库中。 (或者在memcache或文件或其他地方 - 但生成并存储它。)
这样你就可以将这个逻辑移回到项目的创建过程中,这样你就可以做同样的switch
语句,但一次只能查找一个项目 - 你正在切断循环
然后在显示时间,您只需回显已存储的HTML,而不是调用display_listing()
。
答案 3 :(得分:1)
我认为你应该看一些事情。首先,是否有可能会包含相同的“模板”100次?这似乎是放在页面上的大量内容。
如果我使用微小的“片段” - 比如一个重复多次的表格行 - 我倾向于使用一个返回字符串的函数,如下所示:
/* snippets.php */
function tableRow( $row )
{
return
'<tr><td>' . $row['var1'] . '</td>' .
'<td>' . $row['var2'] . '</td></tr>';
}
/* main page/view */
foreach ( $data as $row )
echo tableRow( $row );
这里的主要优点是你可以在函数中使用循环和所有排序。
如果您正在寻找直接变量替换,您可以在HTML文件中创建自己的迷你模板;类似的东西:
<p>{name}<br />
Posted {date} by {author}</p>
然后读入模板,将整个字符串传递给display_listing
函数,该函数在所有{variables}上运行str_replace
。我不认为会有太多的性能损失,但你必须尝试它才能确定。
答案 4 :(得分:0)
您想使用include_once
功能代替include
。
include_once()语句包括 并评估指定的文件 在执行脚本期间。 这是一种类似的行为 include()语句,只有 不同的是,如果代码来自 它已包含一个文件 将不再包括在内。作为 顾名思义,它将被包括在内 只有一次。
答案 5 :(得分:0)
如果您要使用不同关键字的开关包含模板,那么您应该在交换机中设置一个变量,比如说$ template_filename,然后在您退出交换机后,像这样执行包含:< / p>
include_once("/templates/{$filename}.php");
如果您根本不想使用包含,那么您也可以使用模板引擎...
然而,这种方法对我来说似乎是合理的。