此代码不言自明。在我调用该函数并且它工作正常后,其他调用将失败:
<?php
function htmlFilter_array(&$html_array)
{
function nested_clean(&$value)
{
$value = htmlentities($value, ENT_QUOTES, "UTF-8");
}
array_walk_recursive($html_array, 'nested_clean');
}
$arr1=array("id"=>"1");
echo "line 1 <br/>";
$arr2=array("id"=>"2");
echo "line 2 <br/>";
$arr3=array("id"=>"3");
echo "line 3 <br/>";
htmlFilter_array($arr1);
echo "line 4 <br/>";
htmlFilter_array($arr2);
echo "line 5 <br/>";
htmlFilter_array($arr3);
echo "line 6 <br/>";
?>
结果是:
line 1
line 2
line 3
line 4
为什么5号线和6号线不能运行?
如果您不想在其他函数之外访问该函数,可以使用匿名函数。http://php.net/manual/en/functions.anonymous.php(AKA闭合)
实际上,在开发代码时应该显示错误和警告。它会告诉你问题出在哪里。
E_ERROR : type 1 -- Cannot redeclare nested_clean() (previously declared in main/code_145461.php:5) -- at line 5
您通过将函数定义嵌套在另一个函数中来重新定义该函数。
我不知道你为什么要这样嵌套你的函数。
尝试
function htmlFilter_array(&$html_array)
{
array_walk_recursive($html_array, 'nested_clean');
}
function nested_clean(&$value)
{
$value = htmlentities($value, ENT_QUOTES, "UTF-8");
}
第一:打开错误报告。如果PHP没有告诉你什么时候发生了故障,你就无法进行编程。
回答您的问题:您只能定义一次函数。第二次它断开是因为您试图重新定义函数。最简单的是不嵌套函数,PHP无论如何都不允许嵌套这样的函数(这都在全局范围内)。
替代修复:
function htmlFilter_array(&$html_array)
{
$nested_clean = function(&$value)
{
$value = htmlentities($value, ENT_QUOTES, "UTF-8");
};
array_walk_recursive($html_array, $nested_clean);
}
function nested_clean(&$value)
{
$value = htmlentities($value, ENT_QUOTES, "UTF-8");
}
function htmlFilter_array(&$html_array)
{
array_walk_recursive($html_array, 'nested_clean');
}
$arr1=array("id"=>"'1");
echo "line 1 <br/>";
$arr2=array("id"=>"'2");
echo "line 2 <br/>";
$arr3=array("id"=>"'3");
echo "line 3 <br/>";
htmlFilter_array($arr1);
echo "line 4 <br/>";
htmlFilter_array($arr2);
echo "line 5 <br/>";
htmlFilter_array($arr3);
echo "line 6 <br/>";
print_r( $arr1 );
你为什么不使用上面的代码?
否则,您可以使用Closure
函数。
我认为您应该先打开错误报告。但从代码中,我100%确信第5-6行没有输出,因为在htmlFilter_array
中它将显示一些错误,如cannot redeclare function nested_clean
问题是使用嵌套函数时,函数会被一次又一次地重新声明。
function nested_clean(&$value)
{
$value = htmlentities($value, ENT_QUOTES, "UTF-8");
}
function htmlFilter_array(&$html_array)
{
array_walk_recursive($html_array, 'nested_clean');
}
解决方案是在外部声明函数,即使您重复调用它。
尝试分离函数并在htmlFilter_array内部调用nested_clean。。。每次调用htmlFiler_array 时都声明它是没有用的