php ob_start callback failed

5924 ワード

今日はテンプレート交換の問題を解決するためにPHPバッファを使いましたが、非常に卵痛の問題に遭遇しました.
ソースコードは次のように書かれています.
 1 $array = array(

 2    'name' => '  ',

 3    'gift' => 'xphone'

 4 );

 5 $template = '   {name},       {gift}.';

 6                

 7 function callback($buffer) {

 8    global $array;

 9    foreach($array as $key=>$value) {

10       $buffer = str_ireplace('{'.$key.'}', $value, $buffer);

11    }

12    return $buffer;

13 }

14                

15 ob_start("callback");

16 echo $template;

17 $new_tpl =  ob_get_contents();

18 ob_clean();

19 echo $new_tpl;

このようにして、簡単なテンプレート置換機能を実現する.
しかし、このようなコードは私が思ったほど順調に実行されていません.
コードを剥がして直接実行しても全く問題ありません.
フレームワークの問題か,php終了文字後の余分な行かを考慮し,一つ一つ排除する.
ひとしきり卵が痛くて、それからgoogleは1回、やっと原因と解決方法を見つけました.
global is evil!
 
次のように変更します.
 1 $array = array(

 2    'name' => '  ',

 3    'gift' => 'xphone'

 4 );

 5 $template = '   {name},       {gift}.';

 6              

 7 ob_start(function($buffer) use ($array) {

 8    foreach($user as $key=>$value) {

 9       $buffer = str_ireplace('{'.$key.'}', $value, $buffer);

10    }

11    return $buffer;

12 });

13 echo $template;

14 $new_tpl =  ob_get_contents();

15 ob_clean();

16 echo $new_tpl;

主な原因はphp 5.2任意のobjectを開始するとob_startの前に破壊された.
したがって、ここで$arrayは実際のcodeではobjectのvariableである.
ここではglobal$arrayの代わりにuse($array)を使用して、スクリプト実行が終了するまでkeep this variable aliveを実行します.
これで$arrayはob_にはありませんstartの時にメモリ回収メカニズムにやられました.