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";
    }
}

私はこの関数を数回使用します(テキストの長さによって異なります)が、このコードを2回目に取得すると、次のようになります。

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

スクリプトが停止します。

理由はわかりませんが、例外は発生していません。

4

3 に答える 3

2

function_exists() === false2回目のパスで再度宣言されないように、関数宣言の周囲に条件を追加する必要があります。価値があるのは、実際に関数を条件付きで宣言するつもりがない限り(つまり、関数を使用して条件付きで関数を作成する場合を除いて)、通常はネストされた方法で関数を宣言するべきではありません。

この場合、ネストされた関数をメイン関数の外に移動する必要があります。

于 2012-07-26T19:43:36.110 に答える
0

2回目の呼び出しmapWordsToOriginalで再宣言するため、エラーが発生している可能性がありますmap_FilteredWithOriginal

この場合、スコープを制限せず、読みにくくなるため、関数内に関数を定義する理由はありません。

そのように定義する必要がある場合は、PHPのfunction_exists関数を使用して1回だけ宣言できますmap_FilteredWithOriginal

于 2012-07-26T19:43:26.723 に答える
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 に答える