脚本在另一个函数内声明的函数死亡

时间:2012-07-26 19:39:04

标签: php function

我有以下php代码:

  function mapWordsToOriginal()
  {
    try
    {
        $d = array();
        function map_FilteredWithOriginal($n, $m)
        {
            return(array(($n + 1) => ($m + 1)));
        }
        foreach ($this->wordsArray as $word)
        {

            array_push($d, array_map(
                             "map_FilteredWithOriginal", 
                             array_keys(
                               $this->wordsArray, $word), 
                             array_keys($this->originalText, $word)));
        }

        for ($i = 0; $i < count($d); $i++)
        {
            for ($j = 0; $j < count($d[$i]); $j++)
            {
                $this->mapFilteredWithOriginal +=$d[$i][$j];
            }
        }

        if ($this->debug)
        {
            print_r($this->mapFilteredWithOriginal);
        }
    }
    catch (Exception $e)
    {

        echo 'Caught exception: ', $e->getMessage(), "\n";
    }
}

我几次使用此函数(取决于文本的长度),但是当我第二次使用此代码时:

 function map_FilteredWithOriginal($n, $m)
    {
        return(array(($n + 1) => ($m + 1)));
    }

脚本停止了。

我不知道为什么,也没有例外被抓获......

3 个答案:

答案 0 :(得分:2)

您应该在函数声明周围添加function_exists() === false条件,以便在第二次传递时不再声明它。对于它的价值,你通常不应该以嵌套的方式声明函数,除非你真的打算有条件地声明函数(即使用函数来有条件地创建函数)。

在这种情况下,您应该将嵌套函数移到main函数之外。

答案 1 :(得分:0)

您可能收到错误,因为在第二次调用mapWordsToOriginal时,您将重新声明map_FilteredWithOriginal

在这种情况下,没有理由在函数内部定义函数,因为它不会限制范围并使事情变得不那么可读。

如果必须这样定义,可以使用PHP的function_exists函数仅声明map_FilteredWithOriginal一次。

答案 2 :(得分:0)

你不能在那里遇到例外。

您的代码会产生致命错误,因为通过多次调用map_FilteredWithOriginal()来重新声明mapWordsToOriginal()

if ( FALSE === function_exists( 'map_FilteredWithOriginal' ) )
{
    function map_FilteredWithOriginal( $n, $m )
    {
        return( array( ( $n + 1 ) => ( $m + 1 ) ) );
    }
}

这有助于我思考。

尝试在项目中使用error_reporting()仅限开发时间),这样可以更轻松地进行调试。 :)

error_reporting( E_ALL | E_STRICT );

玩得开心。