0

我有以下 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)));
    }

脚本刚刚停止。

我不知道为什么,也没有发现异常......

4

3 回答 3

2

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

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

于 2012-07-26T19:43:36.110 回答
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 );

玩得开心。

于 2012-07-26T19:55:35.070 回答
0

您可能会收到一个错误,因为在第二次打电话给mapWordsToOriginal您时会重新声明map_FilteredWithOriginal.

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

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

于 2012-07-26T19:43:26.723 回答