• ベストアンサー

ob_end_clean と ob_clean の違いはなんですか?

ob_end_clean と ob_clean の違いはなんですか? 両方ともバッファ内容を削除するらしいですが、 ob_end_cleanは、バッファ自体も削除 ob_cleanは、バッファ自体は削除しないとあります。 バッファ自体とはどういう意味でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • onosuke
  • ベストアンサー率67% (310/456)
回答No.2

>バッファ自体とはどういう意味でしょうか? この質問が出るということは、ob_XXXX系関数を利用するにあたっての基礎知識が不足してますね。 --------------------------------- 第一に、ob_XXXX系関数こと、 出力制御関数(output control)について知識を習得しましょう。 参考URLに、マニュアルへのリンクを記載しておきます。 一読して知識を習得してください。 第二に、出力制御関数(output control)の使い方の基本を押さえましょう。 基本は、ob_start() と ob_end_XXXX() を組合せて使うことです。  ・ob_start()で出力制御を開始。  ・ob_end_XXXX()で出力制御を終了。 この、ob_start()とob_end_XXXX()は【必ず】対で利用しなければならないルールなので注意してください。 ------------------------------------------ 基礎知識については以上です。 さて、ここで質問にある >ob_end_clean と ob_clean の違いはなんですか? について考えましょう。 もう答えはお分かりだと思いますが、 ob_end_clean()関数は、ob_end_XXXX()の一種です。 つまり、  ・ob_end_clean():ob_start()で開始した出力制御を終了する場合。  ・ob_clean():出力制御を継続する場合。 というのが2者の違いになります。

参考URL:
http://jp.php.net/manual/ja/ref.outcontrol.php
sweepea
質問者

お礼

ご回答ありがとうございます。 おかげさまでだいたい理解できました。これって基本的なことなんですよね? 独学でPHPを勉強しており、『独習PHP』と『はじめてのPHP言語プログラミング入門』を読んだのですが、出力制御に関して前者は一切ふれず、後者も1ページほどしか説明がありませんでした。 > この、ob_start()とob_end_XXXX()は【必ず】対で利用しなければならないルールなので注意してください。 なるほど。これは、「(実はPHPが勝手にやってくれるけども)本来は、openしたら【必ず】closeしなきゃいけない」というのと同じですね? つまり、バッファを開始したら【必ず】ob_end_flush() とかしなきゃいけない。でも、初心者や面倒臭がり屋や書き忘れた人のために、実はPHPが勝手にやってくれる。という感じでしょうか。 ちなみにバッファがネストできることも知りませんでした。ob_get_level()というネストレベルを返す関数があるのですが、バッファをネストさせた後、ob_end_cleanもしくはob_cleanした場合のネストレベルを調べると、ob_end_cleanの時に、ネストレベルが一つ減っているのを確認しました。 > ・ob_end_clean():ob_start()で開始した出力制御を終了する場合。 > ・ob_clean():出力制御を継続する場合。 書籍にもこのように書いていただけると助かりますね。 ありがとうございました。

その他の回答 (1)

  • yexob328
  • ベストアンサー率25% (1/4)
回答No.1

バッファ自体というのは、有効な状態のバッファということでしょう。 バッファ自体を削除するというのは、有効にしたバッファを無効にするということだと思います。 ob_start(); //バッファを有効にする echo "Hello"; //出力されません echo "World"; //出力されません setcookie("cookiename", "cookiedata"); //セットされます $str01 = ob_get_contents(); //バッファ内容を変数に格納 ob_clean(); //バッファ内容を削除 echo "Hello\n"; //出力されません setcookie("cookiename02", "cookiedata02"); //セットされます $str02 = ob_get_contents(); //バッファ内容を変数に格納 ob_end_clean(); //バッファ内容を削除し、バッファを無効にする(バッファ自体も削除) echo "Hello"; //出力されます echo $str01; // HelloWorld と出力されます echo $str02; //Hello と出力されます setcookie("cookiename", "cookiedata"); //←エラー となります。

sweepea
質問者

お礼

ご回答ありがとうございます。 なるほどよく分かりました。 ob_cleanは現在のバッファ内容を削除して、ob_end_cleanは現在のバッファ自体を削除するから、この例の用に、バッファがネストされていない場合は、ob_end_cleanの後、echoはバッファされずに、直接出力していくって感じですね? ありがとうございました。

関連するQ&A

専門家に質問してみよう