2012-01-23 5 views
2

私はpreg_replace_callbackを持っていますが、2番目のパラメータとしてクロージャ(匿名)関数を使用しています。エラー=>内部サーバーエラー500.私はクロージャを削除すると動作します。preg_replace_callbackのパラメータとしてphp closure関数を使用すると、内部サーバーエラー500が発生します

$regExPattern = '/\<%(?<content>.*?)%\>/'; 
$template = preg_replace_callback($regExPattern, function ($matches) use ($dataItem) { 
    if(isset($dataItem[trim($matches['content'])])) { 
     return $dataItem[trim($matches['content'])]; 
    } 
    else { 
     return ''; 
    } 
}, $template); 

どのように私はこの問題を解決することができます。コールバック関数の中で$ dataItemを使用してpreg_replace_callbackに渡す必要があります。 私の開発環境はコードイグナイターです。

+3

プロダクションサーバーがエラーを出力していません。これは良い設計です。エラーログを確認して、実際のエラーの内容をお知らせください。 –

+1

あなたの開発環境にphp 5.3をインストールしていない可能性がありますか? – boobiq

+0

@boobiqと同じですが、サーバーがPHP 5.3を使用していない可能性が高いですね。 – rdlowrey

答えて

1

匿名関数は、PHP 5.3以降でのみ動作します。あなたは代わりにcreate_function()を使用することもできます。

$regExPattern = '/\<%(?<content>.*?)%\>/'; 
$template = preg_replace_callback($regExPattern, create_function(
     '$matches' 
    , 'if(isset($dataItem[trim($matches[\'content\'])])) { 
      return $dataItem[trim($matches[\'content\'])]; 
     } 
     else { 
      return ""; 
     }' 
    ) 
); 

テストされていない、もちろん。

+1

ありがとうございます。しかし、私は文字列としてコードを書くのが好きではありません。だから私はarray($ this、 'functionName')のような関数を渡し、クラスの本体で宣言しました:private function functionName。ありがとうございます:) –

+0

ええ、それは他の選択肢になります。私はそれが私的な機能で動作するかどうかはわかりませんが、私はあなたがテストしたものと推測します。 – Arjan

関連する問題