0

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

<?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 行无法运行?

4

7 回答 7

2

如果您不希望在其他函数之外访问该函数,则可以使用匿名函数。http://php.net/manual/en/functions.anonymous.php(又名闭包)

于 2013-06-27T13:15:47.280 回答
2

确实,您应该在开发代码时显示错误和警告。它会告诉你问题是什么。

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");
}
于 2013-06-27T13:06:36.850 回答
0

尝试分离函数并在 htmlFilter_array 中调用nested_clean ...每次调用 htmlFiler_array 时都声明它没有用

于 2013-06-27T13:11:56.727 回答
0

我认为您应该先打开错误报告。但是从代码中我 100% 确定第 5-6 行不会产生任何输出,因为htmlFilter_array 它会显示一些错误,例如cannot redeclare function nested_clean

于 2013-06-27T13:09:02.483 回答
0

问题是您使用嵌套函数,该函数一遍又一遍地重新声明。

function nested_clean(&$value) 
{
  $value = htmlentities($value, ENT_QUOTES, "UTF-8");
}

function htmlFilter_array(&$html_array)
{
    array_walk_recursive($html_array, 'nested_clean');
}

解决方案是在外部声明该函数,即使您重复调用它。

于 2013-06-27T13:09:47.623 回答
0

第一:打开错误报告。如果 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);
}
于 2013-06-27T13:08:20.917 回答
0
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函数。

于 2013-06-27T13:08:38.590 回答