使用引用编辑$ _POST

时间:2015-02-01 12:02:46

标签: php

我试图遍历$_POST值并对其进行一些检查/验证等,如下所示:

class Input
{
    public function &Clean(&$source, $field = null)
    {
        $toClean = is_array($source) ? empty($field) ? $source : $source[$field] : $source;


        //check if we are going to clean the whole array or only a specific field!
        if (is_array($toClean)) {
            //we foreach every key/field
            foreach ($toClean as $to => $value)
                $toClean[$to] = $this->DoClean($value);
        } else {
            $this->DoClean($toClean);
        }

        return $toClean;
    }

    private function DoClean(&$toClean)
    {
        return strip_tags(trim($toClean));

        }
    }

new Input()->Clean($_POST);

但这不起作用$_POST的实际值没有改变,这里缺少什么?

3 个答案:

答案 0 :(得分:0)

试试这段代码:

<?php
class Input
{
    public function Clean(&$source, $field = null)
    {
        $toClean = is_array($source) ? empty($field) ? $source : $source[$field] : $source;


        //check if we are going to clean the whole array or only a specific field!
        if (is_array($toClean)) {
            //we foreach every key/field
            foreach ($toClean as $to => $value)
                $toClean[$to] = $this->DoClean($value);

            // CHANGE SOURCE ARRAY
            $source = $toClean;
        } else {
            $this->DoClean($toClean);
        }

        return $toClean;
    }

    private function DoClean(&$toClean)
    {
        return strip_tags(trim($toClean));

    }
}

(new Input())->Clean($_POST);

错误是 - 您复制source数组

答案 1 :(得分:0)

您通过$_POST方法引用Clean(),但不在方法中更改它。

在功能$source中使用$toClean(并删除Clean()),它会更改$_POST中的值(或传递给Clean()的任何数组当你打电话时作为参数)。

答案 2 :(得分:0)

您似乎稍微误解了concept of reference,或至少如何使用它。从PHP文档(强调我的):

  

您可以通过引用函数传递变量,以便函数可以修改变量

您仍然需要修改函数内的变量。并且您不需要再返回它,因为它已被修改。

最简单的示例是您的DoClean方法。在编写它时,引用是无用的,因为您从不修改输入值。因此,以下内容与您的函数完全相同(就其作用而言):

private function DoClean($toClean)
{
    return strip_tags(trim($toClean));
}
// use it as follows :
$toClean = $this->DoClean($toClean);

但是,如果您确实想使用引用,则可以修改输入变量。因此,您不再需要返回该值,传递给函数的值将包含调用后的结果。例如:

private function DoClean(&$toClean)
{
    $toClean = strip_tags(trim($toClean));
}
// use it as follows
$this->DoClean($toClean);

这两个例子中对$toClean的影响相同。

现在正如axiac指出的那样,你的Clean()函数会产生同样的困惑。它同时使用引用和return,而$source是对$_POST的引用,$toClean不再是$_POST。您修改的所有变量都需要被引用才能修改$source,如果在中间步骤中有某个副本,它将自行修改,但不会修改原始变量。两种解决方案:

  • 直接使用$source
  • 通过引用将$toClean分配给if( !is_array($source) || empty($field) ) $toClean = &$source; else $toClean = &$source[$field]; 。在这种情况下,您无法使用三元形式。试试:
class Input
{
    public function Clean(&$source, $field = null)
    {
        if( !is_array($source) || empty($field) )
            $toClean = &$source;
        else
            $toClean = &$source[$field];

        if (is_array($toClean)) {
            array_walk($toClean, array($this, 'DoClean');
        } else {
            $this->DoClean($toClean);
        }
    }

    private function DoClean(&$toClean)
    {
        $toClean = strip_tags(trim($toClean));
    }
}
(new Input())->Clean($_POST);

执行此类操作后,您可能需要查看array_walk and array_walk_recursive以使整体代码更简单:

{{1}}