
本文介绍如何将重复出现的 foreach 渲染逻辑抽取为可复用函数,避免 html 输出代码冗余,提升 php 代码的可维护性与可读性。
本文介绍如何将重复出现的 foreach 渲染逻辑抽取为可复用函数,避免 html 输出代码冗余,提升 php 代码的可维护性与可读性。
在实际开发中,当多个数组需以相似结构渲染 HTML(如
最直接、稳健的重构方式是将共用渲染逻辑封装为纯函数。该函数接收数据源(数组)、容器类名及可选的子内容(如嵌套 HTML),统一生成并返回 HTML 字符串。这样既解耦了数据与视图,又支持任意层级复用。
以下为优化后的示例代码:
<?php
$apples = ['red'];
$bananas = ['yellow'];
/**
* 通用水果列表 HTML 生成器
* @param array $fruitList 要渲染的水果值数组
* @param string $class 外层容器 CSS 类名
* @param string $child 可选:嵌入在容器内部的子 HTML 内容
* @return string 渲染完成的 HTML 字符串
*/
function getFruitListHTML(array $fruitList, string $class, string $child = ''): string {
$out = '';
foreach ($fruitList as $fruitItem) {
$out .= "<div class=\"$class\">";
$out .= htmlspecialchars($fruitItem, ENT_QUOTES, 'UTF-8'); // ✅ 安全防护:防止 XSS
$out .= $child;
$out .= '</div>';
}
return $out;
}
// 1. 首次生成苹果列表 HTML
$applesHTML = getFruitListHTML($apples, 'apple');
// 2. 直接复用:输出苹果列表 + 嵌套在香蕉项中
echo $applesHTML;
echo getFruitListHTML($bananas, 'banana', "<div class=\"child\">$applesHTML</div>");✅ 关键改进点说明:
- 单一职责:getFruitListHTML() 仅负责“将数组转为指定结构的 HTML”,不涉及业务判断或外部状态;
- 参数化灵活:通过 $child 参数支持任意嵌套内容(字符串或已生成的 HTML),无需修改函数体;
- 安全性增强:添加 htmlspecialchars() 对输出内容做基础转义,防范潜在 XSS 风险(原始示例中缺失);
- 类型声明明确:使用 array 和 string 类型提示,提升 IDE 支持与可读性;
- 无副作用:函数纯正,不依赖全局变量或修改入参,便于单元测试。
⚠️ 注意事项:
- 若数据量极大(如数千项),拼接字符串可能影响性能,此时建议改用 ob_start() 缓冲或流式输出;
- 若 HTML 结构复杂(含条件逻辑、多级嵌套、模板变量),应进一步升级为 Twig/Blade 等模板引擎,而非在函数中堆砌 HTML;
- 避免在 $child 中传入未经校验的用户输入——函数本身不负责过滤,调用方须确保 $child 内容安全。
总结:遵循 DRY 并非追求“最少行数”,而是追求“最小变更半径”。一次封装、多处复用,让后续新增 pears 或 oranges 数组时,只需一行调用即可完成渲染,真正实现高内聚、低耦合的代码设计。










