php函数不能进行第二次调用


php function cannot be called for the second time

此代码不言自明。在我调用该函数并且它工作正常后,其他调用将失败:

<?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 时都声明它是没有用的