
いつもお世話になっております。
バージョン: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」は出力されないのではと私は思っているのですが…。
No.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処理が抜けているので、わざわざさいごにフラッシュしてくれている
と考えるのが賢明です
補足をどうもありがとうございます。
>たしかにマニュアルを見る限り、ob_start()からob_end_clean()もob_end_flush()も指定しない場合はどうなるか書いてないようですね
仰る通りで、私もアレコレ調べてみたのですが、
マニュアル(英文の所では書かれているかもしれませんが)の日本語の部分を読む限りでは、
私が知りたいことについての記述はありませんでした。
>ちなみに「?>で」出力されるのではなく、スクリプトの終了時に出力
されると考えるのが妥当でしょう。
そうですね、色々と試した感じでは、yamabejpさんが仰る通りの仕様であるように思います。
>わざわざさいごにフラッシュしてくれていると考えるのが賢明です
暗黙の了解ということなんでしょうかね。
基礎的なことかもしれませんが、こういったことに関する記述もPHPマニュアルには書いてあって欲しいなと今回思いました。
No.1
- 回答日時:
ob_end_clean()でバッファをクリアしてないので、
ためてたバッファがフラッシュされているという解釈でよいのでは?
yamabejpさん、どうもありがとうございます。
ob_start();で溜めたバッファは、
フラッシュ処理(例えば、ob_flush()等)をしなくても、
フラッシュされてしまうものなのでしょうか?
前述しましたが、例えば、
「?>」をきっかけに、バッファされているものは、
フラッシュされてしまうのでしょうか?
>ob_end_clean()でバッファをクリアしてないので、
>ためてたバッファがフラッシュされているという解釈でよいのでは?
「クリアはしていないので、バッファ内容自体は残っている」
ということは分かっているのですが、
フラッシュ処理をしないのにフラッシュされることに疑問を感じております。
【2】では、フラッシュしているので、出力されるのは理解できますが、
【1】では、フラッシュをしていないのに、出力されているわけです。
この点について、更なるアドバイスを頂けると嬉しいです。
宜しくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- PHP ECCUBE4のページ管理でPHPを実行させたい 1 2023/04/06 11:42
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- PHP PHP MySql ページング 2 2022/09/20 06:38
- 英語 The implant was placed to be flush with the crest 3 2022/04/30 00:48
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- 英語 英語の「Asian flush」という言葉の意味について 1 2022/07/22 17:12
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Access(アクセス) MAXで0が出力される 1 2022/03/31 21:43
- Visual Basic(VBA) Selenium Basicの件 5 2023/04/10 20:55
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メディアンフィルタ
-
名古屋の栄と錦は治安悪い?
-
winで使えるフリーのphp用エデ...
-
VB.NET でのLaod/unLoad につ...
-
皆さんのオススメのエディタは...
-
ヒント表示について
-
C言語の関数の実引数と仮引数の...
-
テキストボックスからフォーカ...
-
word
-
PowerPoint SmartArtの箇条書...
-
数式中の文字をCambria Math以...
-
表示を大きくする方法
-
illustratorとExcelは連携出来...
-
バイナリファイルの編集
-
Microsoft Access で同じフィー...
-
Chromebookでオフラインでテキ...
-
Adobe photoshop CS2 テキスト...
-
棒読みちゃんでWEBページを読み...
-
画像からテキストデータを正確...
-
Macのテキストエディタを使って...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
名古屋の栄と錦は治安悪い?
-
VB.NET でのLaod/unLoad につ...
-
VB.NETのテキストボック...
-
項目数は英語で
-
テキストボックスからフォーカ...
-
NumericUpDownの数値を選択済み...
-
『μg』の読み方と意味。
-
フォームを開く時のイベント処理
-
mailの送信音がしなくなったの...
-
vba メモリーリーク
-
C++の例外処理
-
VBのレコードセットを閉じない...
-
ヒント表示について
-
シリアル通信について
-
ブック開いたときのフォーカス指定
-
シリアルフラッシュメモリをな...
-
デュアルモニタ×2分岐
-
120Gのハードディスクを2個...
-
phpからxmlの上書き
-
TextBoxにカーソルがあるかない...
おすすめ情報