gpt4 book ai didi

php - 巨型 elseif 链、巨型开关或具有功能的微型开关?

转载 作者:搜寻专家 更新时间:2023-10-31 21:17:41 25 4
gpt4 key购买 nike

我有一个 9000 行的 PHP 文件,其中包含大约 30 个离散区域,通过 $_POST 变量导航。所以一个人可能是......

elseif (isset($_POST['view_user']) 
|| isset($_POST['edit_user'])
|| isset($_POST['process_user_status']))

...等等。我大概有大约 75 个进入这 30 个区域的点,所有这些都由像上面这样的长 elseif isset 链处理。

我一直在考虑将其更改为更理智的东西。到目前为止我提出的想法:

1) 将帖子归结为一个 bool 值,并在 elseif 链中使用它。所以上面的内容可以归结为 elseif ($area_user),如果 $上面的 _POST 已设置。但这并没有真正解决复杂性问题。

2) 用例代替elseif。所以上面会变成...

case (isset($_POST['view_user'])):
case (isset($_POST['edit_user'])):
case (isset($_POST['process_user_status'])):
do stuff;
break;

但是,同样,虽然它删除了 elseif 语法,但它只是将其替换为某种东西,虽然稍微更易于管理,但可能仍然隐藏了真正的问题。

3) 使用函数。所以在页面的顶部,我有一个类似的 switch 语句,但它不是在页面中间直接进入脚本区域,而是调用一个函数,所以它可能调用 用户区($_POST['whatever'])。这样做的好处是可以将所有 $_POST 变量移出脚本主体,并将它们集中到导航和函数调用中。但是,它需要大量的全局函数声明,目前我不需要这样做,因为 elseif 的分支在全局范围内。

4) 使用完整的 MVC 拆分、模板等进行完全重构。很想这样做,但目前不是一个选项。很高兴我分离了模型,但 View 和 Controller 现在必须共存。

在我写这篇文章的过程中,我越来越相信自己是 3,但我想看看你们这些好心人的想法。对于这种情况,最佳实践导航应该是什么?

最佳答案

您还有一个选择:处理函数字典。

将您所有的潜在 $_POST 键('view_user' 等)放在一个关联数组中,指向处理它们的函数(名称)。然后,代替您的 ifelse 链,遍历实际 $_POST 键,直到您在数组中找到匹配项并调用相关函数。

现在您可以毫不费力地将您的处理程序函数移动到其他文件中,尽管您可能需要向该动态函数调用添加一些参数。大多数 MVC 框架都使用这种分派(dispatch)(针对路径中的模式,而不是表单或查询字符串数据)。

// Untested, but something like this
$handlers = array(
'view_user' => 'UserArea',
'edit_user' => 'UserArea',
'view_document' => 'DocManagement', // for example
// etc...
);
foreach ($_POST as $key => $value) {
if(array_key_exists($key, $handlers)){
call_user_func($handlers[$key]);
}
}

关于php - 巨型 elseif 链、巨型开关或具有功能的微型开关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5068358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com