プロが教えるわが家の防犯対策術!

いつもお世話になっております。
バージョン:PHP5.2.5

【1】
<?php
ob_start();
echo 'test';
?>

【2】
<?php
ob_start();
echo 'test';
ob_flush(); //【1】との違いはここだけ。
?>

【1】のように、
ob_flush() の記述のない書き方でも「test」が出力されてしまうのは、なぜなのでしょう?
(実際、試してみたところ、出力されてしまいました。)
「?>」の記述をもとに、自動的にflushしちゃう仕様なのでしょうか?

通常であれば、【2】のように書かないと、「test」は出力されないのではと私は思っているのですが…。

A 回答 (2件)

たしかにマニュアルを見る限り、ob_start()からob_end_clean()もob_end_flush()も


指定しない場合はどうなるか書いてないようですね
しかしバッファはスタッカブルな仕様ですから、ob_end_flush()のつけ忘れ
も懸念されますので、スクリプトが閉じた時点でob_start()とob_end_??の
数が一致していない(=指定し忘れた)場合ob_end_flushするというのが
「たまたま」ルールになっているのではないでしょうか?

バッファというのはそもそも出力を一時的に停止する措置ですから、
スクリプトが終了した時点で出力されるのはまっとうな処理に思えます。

ちなみに「?>で」出力されるのではなく、スクリプトの終了時に出力
されると考えるのが妥当でしょう。

<?
print ob_start();
print "hoge";
?>fuga

としたときにob_start()の戻り値である1がhogeの前に表示されることからも
処理の妥当性が理解できると思います。

フラッシュ指示していないのにフラッシュしていないのではなく
end処理が抜けているので、わざわざさいごにフラッシュしてくれている
と考えるのが賢明です
    • good
    • 0
この回答へのお礼

補足をどうもありがとうございます。

>たしかにマニュアルを見る限り、ob_start()からob_end_clean()もob_end_flush()も指定しない場合はどうなるか書いてないようですね

仰る通りで、私もアレコレ調べてみたのですが、
マニュアル(英文の所では書かれているかもしれませんが)の日本語の部分を読む限りでは、
私が知りたいことについての記述はありませんでした。

>ちなみに「?>で」出力されるのではなく、スクリプトの終了時に出力
されると考えるのが妥当でしょう。

そうですね、色々と試した感じでは、yamabejpさんが仰る通りの仕様であるように思います。

>わざわざさいごにフラッシュしてくれていると考えるのが賢明です

暗黙の了解ということなんでしょうかね。
基礎的なことかもしれませんが、こういったことに関する記述もPHPマニュアルには書いてあって欲しいなと今回思いました。

お礼日時:2009/09/28 18:56

ob_end_clean()でバッファをクリアしてないので、


ためてたバッファがフラッシュされているという解釈でよいのでは?
    • good
    • 0
この回答へのお礼

yamabejpさん、どうもありがとうございます。

ob_start();で溜めたバッファは、
フラッシュ処理(例えば、ob_flush()等)をしなくても、
フラッシュされてしまうものなのでしょうか?

前述しましたが、例えば、
「?>」をきっかけに、バッファされているものは、
フラッシュされてしまうのでしょうか?

>ob_end_clean()でバッファをクリアしてないので、
>ためてたバッファがフラッシュされているという解釈でよいのでは?

「クリアはしていないので、バッファ内容自体は残っている」
ということは分かっているのですが、
フラッシュ処理をしないのにフラッシュされることに疑問を感じております。

【2】では、フラッシュしているので、出力されるのは理解できますが、
【1】では、フラッシュをしていないのに、出力されているわけです。

この点について、更なるアドバイスを頂けると嬉しいです。
宜しくお願い致します。

お礼日時:2009/09/27 22:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!