信息发布→ 登录 注册 退出

PHP递归函数:避免使用全局变量的实践指南

发布时间:2025-11-01

点击量:

PHP递归函数:避免使用全局变量的实践指南

本文旨在解决在php递归函数中避免使用全局变量的问题。通过修改递归函数的返回值,并利用`array_merge`函数在父级调用中合并结果,可以有效地消除对全局变量的依赖,提高代码的可维护性和可读性。此外,还简要介绍了使用递归公共表表达式(cte)优化数据库查询的方法。

在编写PHP递归函数时,经常会遇到需要在多次递归调用之间共享数据的场景。一种常见的做法是使用全局变量,但这往往被认为是不良的编程实践,因为它会增加代码的复杂性,降低可维护性,并可能导致意外的副作用。本文将介绍一种避免使用全局变量的有效方法,并通过示例代码进行演示。

递归函数与全局变量的弊端

假设我们需要构建一个函数,用于获取数据库中某个父节点的所有子节点(包括子节点的子节点,以此类推)。一个常见的实现方式是使用递归函数,并在函数内部使用全局数组来存储所有子节点的信息。

以下是一个使用全局变量的示例:

<?php

$familyArray = []; // 全局变量

function checkForChildren($uuid, $conn){
    global $familyArray;

    $sql = "SELECT id, uuid, name FROM people WHERE parent = '".$uuid."'";
    $result = mysqli_query($conn, $sql);

    if (mysqli_num_rows($result) > 0){
        foreach ($result as $row){
            $familyArray[]= [
                'id' => $row['id'],
                'uuid' => $row['uuid'],
                'name' => $row['name']
            ];
            checkForChildren($row['uuid'],$conn);
        }
    }
    return $familyArray;
}

?>

虽然上述代码可以正常工作,但使用全局变量存在以下问题:

  • 可维护性差: 全局变量可以在程序的任何地方被修改,这使得代码难以追踪和调试。
  • 命名冲突: 如果在不同的函数或文件中使用了相同的全局变量名,可能会导致命名冲突。
  • 副作用: 全局变量的修改可能会影响程序的其他部分,导致难以预测的行为。

避免使用全局变量的解决方案

为了避免使用全局变量,我们可以修改递归函数的返回值,使其返回一个包含所有子节点的数组。然后在父级调用中使用array_merge函数将子节点的数组合并到结果数组中。

以下是修改后的代码示例:

<?php

function checkForChildren($uuid, $conn){
    $familyArray = [];

    $sql = "SELECT id, uuid, name FROM people WHERE parent = '".$uuid."'";
    $result = mysqli_query($conn, $sql);

    foreach ($result as $row){
        $familyArray[] = [
            'id' => $row['id'],
            'uuid' => $row['uuid'],
            'name' => $row['name']
        ];
        $familyArray = array_merge($familyArray,checkForChildren($row['uuid'],$conn));
    }

    return $familyArray;
}

?>

在这个修改后的版本中,checkForChildren 函数不再依赖全局变量。它在每次递归调用时创建一个新的 $familyArray,并将当前节点的子节点信息添加到该数组中。然后,它递归调用自身来获取子节点的子节点信息,并将返回的数组使用 array_merge 合并到 $familyArray 中。最终,该函数返回包含所有子节点信息的 $familyArray。

NameGPT NameGPT

免费的名称生成器,AI驱动在线生成企业名称及Logo

NameGPT 119 查看详情 NameGPT

进一步优化:使用递归公共表表达式(CTE)

虽然上述方法可以避免使用全局变量,但每次递归调用都需要执行一次数据库查询,这可能会导致性能问题。为了进一步优化性能,可以考虑使用递归公共表表达式(CTE)。

递归 CTE 允许在单个SQL查询中执行递归操作,从而避免了多次数据库往返。这可以显著提高查询效率,尤其是在处理大型数据集时。

不同的数据库系统对递归 CTE 的语法支持略有不同,具体用法请参考相应的数据库文档。例如,在 MySQL 8.0 及更高版本中,可以使用以下语法:

WITH RECURSIVE employee_hierarchy AS (
    SELECT id, uuid, name, parent
    FROM people
    WHERE parent = '0001' -- 初始父节点的 UUID

    UNION ALL

    SELECT e.id, e.uuid, e.name, e.parent
    FROM people e
    INNER JOIN employee_hierarchy eh ON e.parent = eh.uuid
)
SELECT * FROM employee_hierarchy;

总结:

通过修改递归函数的返回值并使用 array_merge 函数,可以有效地避免在 PHP 递归函数中使用全局变量。此外,使用递归公共表表达式(CTE)可以进一步优化数据库查询性能。在实际开发中,应根据具体情况选择合适的解决方案。

以上就是PHP递归函数:避免使用全局变量的实践指南的详细内容,更多请关注php中文网其它相关文章!


相关文章: QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  AO3镜像入口大全 AO3网页版内容访问全集  PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误  将PCM16音频数据转换为W*并编码为Base64教程  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  小米Civi 4录制视频过暗_小米Civi 4亮度优化  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问  在python-socketio事件处理器中安全访问Flask应用上下文  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  Go语言中动态执行代码字符串的策略与实践  漫蛙2正版漫画站 漫蛙2网页版快速访问入口  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  从OpenAI API响应中高效提取生成文本  谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  Win10双系统截图高效法 截屏快捷键速记【技巧】  天眼查企业查询官网入口 天眼查官方网页版查询  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  PHP中基于用户角色的页面访问控制实践  J*a实现学校排课程序_面向对象结构化项目示例  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  构建轻量级网站内部消息系统:Formspree 集成指南  J*a应用集成GitHub CLI与API认证指南  必由学官方网站入口 必由学学生教师共用登录通道  在Pyomo中实现基于变量的条件约束:Big-M方法详解  Lar*el头像管理:图片缩放与旧文件删除的最佳实践  win11如何加载ICC颜色配置文件 Win11校色文件安装与显示器色彩管理【指南】  c++项目目录结构应该如何组织_c++工程化项目结构规范  CSS实现侧边栏导航项全宽圆角悬停背景效果  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  学习通在线学习平台 学习通网页版直接进入课程中心  LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  Golang如何使用context实现超时取消_Golang context超时取消模式实践  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异  在Typer应用中优雅地处理和重组任意命令行参数 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!