将 $_POST/$_GET 作为参数传递给函数

Sco*_*ady 2 php

我遇到了一段有趣的 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 是一个全局变量?

一个完整的远景:他们是否可以对此做出任何善意的“后来的补充”(例如我的例子),几乎可以证明这种做法是合理的,或者这只是一种误解。或者是否存在可以证明这种做法合理的安全隐患?

Kit*_*ita 6

IMHO it's a practice of abstraction, and there are benefits:

  1. 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.

  2. 控制反转:因为函数的dependency( $_POST)是从外部注入的,所以你对函数有更多的控制权。这有点不太可能,但让我们假设您的表单已更新,现在您需要通过 GET 方法提交。在不修改函数体的情况下,在$_GET调用方传入,就足以反映变化。

  3. 测试夹具隔离:为了模拟 FORM 输入来测试函数中的某个代码路径,最好$_POST以抽象的方式访问全局状态(例如),这样测试本身不会给系统的其他部分带来副作用。