我遇到了一段有趣的 PHP 代码,它让我有点困惑作者为什么选择这样做。
function do_something($db, $post_vars){
foreach($post_vars as $key => $value{
$vars[$key] = mysqli_real_escape_string($db, $value);
}
return $vars;
}
$db = mysqli_connect("myhost","myuser","mypassw","mybd") or die("Error " . mysqli_error($link));
do_something($db, $_POST);
Run Code Online (Sandbox Code Playgroud)
它让我思考为什么有人想要将 $_POST 作为变量传递而不是直接在函数内部访问它?我能想到的唯一好处(这有点远)是如果我们在调用函数之前将其他信息附加到 $_POST (例如):
function do_something($db, $post_vars){
foreach($post_vars as $key => $value{
$vars[$key] = mysqli_real_escape_string($db, $value);
}
return $vars;
}
$db = mysqli_connect("myhost","myuser","mypassw","mybd") or die("Error " . mysqli_error($link));
foreach($_POST as $post_key => $post_value){
$post[$post_key] = $post_value;
}
$post['my_custom_var'] = "a";
do_something($db, $post);
Run Code Online (Sandbox Code Playgroud)
但是,在代码中的任何地方都没有这种做法的证据。只是调用do_something()与$_POST作为arugment传递。
我的问题是,这样做有什么好处,我错过了还是作者根本不明白 $_POST 是一个全局变量?
一个完整的远景:他们是否可以对此做出任何善意的“后来的补充”(例如我的例子),几乎可以证明这种做法是合理的,或者这只是一种误解。或者是否存在可以证明这种做法合理的安全隐患?
IMHO it's a practice of abstraction, and there are benefits:
Generality: by receiving $_POST as a parameter, the function becomes less tightly coupled to $_POST. The function may serve more scenarios & possibly be more reusable.
控制反转:因为函数的dependency( $_POST)是从外部注入的,所以你对函数有更多的控制权。这有点不太可能,但让我们假设您的表单已更新,现在您需要通过 GET 方法提交。在不修改函数体的情况下,在$_GET调用方传入,就足以反映变化。
测试夹具隔离:为了模拟 FORM 输入来测试函数中的某个代码路径,最好$_POST以抽象的方式访问全局状态(例如),这样测试本身不会给系统的其他部分带来副作用。
| 归档时间: |
|
| 查看次数: |
1929 次 |
| 最近记录: |