如何复用PHP函数避免代码重复?游戏手册开发求助
嘿,这个问题我太有共鸣了——重复写相同的调用代码不仅繁琐,后期要新增或修改区块时,还得在页面里到处找代码改,简直是维护噩梦!咱们可以用配置驱动+通用渲染封装的思路来彻底解决这个问题,让新增区块只需要加配置,不用碰核心渲染逻辑。
我给你捋个具体实现步骤:
1. 先标准化你的核心处理函数
确保你那两个函数的输入输出统一,比如:
// 从HTML文件提取并返回渲染后的内容 function renderHtmlBlock(string $filePath): string { // 你的现有逻辑:读取HTML文件、处理格式等 if (!file_exists($filePath)) { return "<p>HTML区块文件不存在: {$filePath}</p>"; } return file_get_contents($filePath); } // 从CSV文件生成表格HTML并返回 function renderCsvTable(string $filePath): string { // 你的现有逻辑:读取CSV、生成表格标签等 if (!file_exists($filePath)) { return "<p>CSV数据文件不存在: {$filePath}</p>"; } $csvData = array_map('str_getcsv', file($filePath)); $html = '<table class="game-table">'; // 表头 $html .= '<thead><tr>' . implode('', array_map(fn($col) => "<th>{$col}</th>", $csvData[0])) . '</tr></thead>'; // 表体 $html .= '<tbody>'; foreach (array_slice($csvData, 1) as $row) { $html .= '<tr>' . implode('', array_map(fn($col) => "<td>{$col}</td>", $row)) . '</tr>'; } $html .= '</tbody></table>'; return $html; }
2. 用配置数组管理所有区块
把每个区块的类型、文件路径、甚至标题这类元数据都放到一个数组里,相当于给页面列个“内容清单”:
$contentBlocks = [ [ 'type' => 'html', 'path' => './game-manual/intro.html', 'title' => '游戏简介' ], [ 'type' => 'csv', 'path' => './game-manual/character-stats.csv', 'title' => '核心角色属性表' ], [ 'type' => 'html', 'path' => './game-manual/controls-guide.html', 'title' => '基础操作指南' ] ];
要是以后想加第四个区块,直接在这个数组里加一行就行,完全不用动页面渲染的代码。
3. 封装通用渲染函数
写一个统一的渲染器,遍历配置数组,根据区块类型自动调用对应的处理函数,最后把所有内容拼起来:
function renderContentBlocks(array $blocks): string { $pageContent = ''; foreach ($blocks as $block) { // 可选:渲染区块标题 if (!empty($block['title'])) { $pageContent .= "<h2 class='block-title'>{$block['title']}</h2>"; } // 根据类型分发到对应的处理函数 switch ($block['type']) { case 'html': $pageContent .= renderHtmlBlock($block['path']); break; case 'csv': $pageContent .= renderCsvTable($block['path']); break; // 以后新增其他类型(比如Markdown),直接加case就行 default: $pageContent .= "<p class='error'>未知区块类型: {$block['type']}</p>"; } // 可选:给每个区块加个分隔线,提升页面可读性 $pageContent .= '<div class="block-divider"></div>'; } return $pageContent; }
4. 页面里一行代码搞定所有渲染
现在你的页面只需要调用这个通用函数,所有区块就会自动渲染出来:
<!DOCTYPE html> <html> <head> <title>游戏手册</title> <!-- 你的样式表 --> </head> <body> <h1>XX游戏官方手册</h1> <?php echo renderContentBlocks($contentBlocks); ?> </body> </html>
进阶优化小建议
- 把
$contentBlocks配置放到单独的文件(比如blocks-config.php)里,维护起来更清晰; - 给处理函数加缓存逻辑,比如用
filemtime检查文件是否更新,避免每次请求都重复解析HTML/CSV,提升页面加载速度; - 可以给区块配置加更多自定义参数,比如CSV表格的CSS类名、HTML区块是否需要过滤脚本等,让渲染更灵活。
内容的提问来源于stack exchange,提问作者Mark Henham
相关产品推荐
相关产品推荐

