php ob_start callback failed
5924 ワード
今日はテンプレート交換の問題を解決するためにPHPバッファを使いましたが、非常に卵痛の問題に遭遇しました.
ソースコードは次のように書かれています.
このようにして、簡単なテンプレート置換機能を実現する.
しかし、このようなコードは私が思ったほど順調に実行されていません.
コードを剥がして直接実行しても全く問題ありません.
フレームワークの問題か,php終了文字後の余分な行かを考慮し,一つ一つ排除する.
ひとしきり卵が痛くて、それからgoogleは1回、やっと原因と解決方法を見つけました.
global is evil!
次のように変更します.
主な原因はphp 5.2任意のobjectを開始するとob_startの前に破壊された.
したがって、ここで$arrayは実際のcodeではobjectのvariableである.
ここではglobal$arrayの代わりにuse($array)を使用して、スクリプト実行が終了するまでkeep this variable aliveを実行します.
これで$arrayはob_にはありませんstartの時にメモリ回収メカニズムにやられました.
ソースコードは次のように書かれています.
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の時にメモリ回収メカニズムにやられました.