我试图遍历$_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
的实际值没有改变,这里缺少什么?
答案 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}}