• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ob_start関数?について教えて下さい)

ob_start関数の意味と使い方とは?

このQ&Aのポイント
  • ob_start関数は、出力のバッファリングをオンにするための関数です。
  • バッファリングを有効にすると、スクリプトからの出力は保存されるだけで実際には行われません。
  • 使用例として、phpinfo関数で取得した情報をバッファに保存して後で処理することができます。

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

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 んっと…その例題はあんまりよい例題には見えないですねぇ(苦笑 ちと背景知識が必要なので長くなって恐縮ですが、順を追って。 CGI(広義のCGI:もちろんPHPも含みます)は、ものすごく大雑把に分けて、ヘッダ部とボディ部とに切り分けられます。 PHP的には、headerという関数を用いて出力するのがヘッダ部、printやらechoやらで出力する部分がボディ部になります。 割合よく使われるヘッダは、 ・画像出力やその他のファイル系出力でContent-typeを変える ・Cookieを発行する(setcookie関数) あたりでしょうか? で。通常、例えばPerlなどでCGIを作る場合には普通にお約束なのですが。 本来、出力は ・ヘッダ部を全部出力 ・空の改行を1行出力 ・ボディ部(HTMLが書いてあるところ)を出力 という手順で行います。ただ、PHPは「ヘッダ部と空の改行」を自動的に出力してくれるので、プログラム中でいきなりprint文とかでHTMLを出力しても、問題なく動きます。 ところが。例えばプログラムの流れ上の理由で、「print文」でボディ部の一部を出力した後にsetcookieをしたいような場合、 ・ボディ部を出力した後にヘッダ部を出力しようとした という理由で、プログラムがエラーをはいてしまいます。 もちろん「プログラムの処理順番を変える」という方法もあるのですが、プログラム的にきれいに直し難い場合もありまして。 こんなときにob_startを使います。 始めにob_startを宣言しておけば、header関数とprint文が交互にくるような状態でも、問題なく動かすことができます。 こんなんで概ねわかりますでしょうか? 分かりにくい場所などありましたら突っ込んでいただけると。

muku101681
質問者

お礼

がるさん、ありがとうございます。 なんとなく、、、で申しわけありませんが、理解できました。ただまだ解らない部分もあるのですが、どう質問していいのか、、、 的外れな質問でしたら申し訳ありません。 つまり本来はボディ部が出力されるとその後ヘッダ部は出力できなくなるが、ob_startを宣言すればボディ部記述の中にもヘッダに記述するようなことを記述できるという事でしょうか? だとしたら、(今はまだまだ知識不足でこの関数がどれくらい便利なのかはぼんやりとしか想像できないのですが、)結構便利な関数のような気がしますね。 それでお手数をおかけしてしまうのですが、その質問に書いたあまりよくない例題は何をしているのか、教えていただけたらと思うのですが。 例題のスクリプトだけではわかりにくかったら申し訳ありません。

その他の回答 (2)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.3

がるです。 > このサンプルは結構有名な雑誌に載っているのですが、雑誌に載っているからといっていいサンプルではないのですね、、、、、 えっと………(苦笑 ぶっちゃけ。有名な書籍であることと中身が優れていることには、必ずしも相関関係が成り立たないものなので(苦笑 このあたりがまたなんとも難しいところではあるのですが。 > ラッパー関数というのはどうゆう関数の事なのでしょうか? ををっとすみません。 > 「文字列を復帰する関数」という言葉の意味 を含めて、ざっくりと。 通常、関数ってのは、本来的には 戻り値 関数名(引数) っていう宣言の仕方をするです。 例えば…時刻を取得する time というPHP標準関数 ( http://www.php.net/manual/ja/function.time.php )を見ていただくと、 int time ( void ) っていう風に宣言されているかと思うのですが。 この場合 戻り値は int 関数名は time 引数は void (これは「引数はない」って意味になります) になるです。 で。「文字列を復帰する関数」ってのは、この「戻り値」の部分がstringになっているものを指します。 そうですねぇ…同じ日付系ですと、 date という関数 ( http://www.php.net/manual/ja/function.date.php ) がそれにあたりますね。例えば。 で。ラッパー関数というのは、文字通り「何かほかの関数をラッピングしている」関数になります。 例えば。dateを使って $s = date(DATE_RFC822); print $s . "<br />\n"; という処理がしょっちゅうあるときに。毎回2行書くのって面倒ですよね? こういうときに、例えば function date_put_822() { $s = date(DATE_RFC822); print $s . "<br />\n"; } っていう小さな関数を一つ作って、後は毎回 date_put_822(); でcallすれば楽ですよね? こういうのをよく「ラッパー関数」とかって呼ぶです。…ちと一般的名称かどうか自信ないのですが(苦笑 あと、お勧めの書籍ですが…………………ないんですよねぇ(苦笑 周囲と話をしていたりもするのですが。「PHPのお勧めの書籍ですか? やっぱり"入門C言語"とかなのでは?」とかいう微妙な話が出るくらいに(苦笑 いつかは書いてみたいものですが……

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がるです。 > つまり本来はボディ部が出力されるとその後ヘッダ部は出力できなくなるが、ob_startを宣言すればボディ部記述の中にもヘッダに記述するようなことを記述できるという事 です。基本的にはそーゆー用途がメインかと。 で。例題ですが………ちと根の深い背景が(苦笑 直接的には「phpinfo関数で出力されるデータを、画面に出力するのではなくて、変数(今回ですと $PHPInfoModules )で取得する」もの。なのですが。 # 注意。以降暴言を吐きます(苦笑 普通。こーゆー関数を実装する場合、まず「文字列を復帰する関数」を作り、しかる後にそのラッパーとして「画面に出力する関数」を作ります。 つまり。例えば、stringを復帰するような関数「phpinfo_string」のような関数を作り、しかる後に function phpinfo() { print phpinfo_string(); } のようなラッパー関数を作るものなのですが。 PHPの場合、そういったことをせずに無理やり実装しようとしてこうなっています。 まぁ正直実装的に失敗している例です(苦笑 なにかわからない部分などありましたらまたコメントください。

muku101681
質問者

お礼

素人に丁寧に教えていただき、ありがとうございます。このサンプルは結構有名な雑誌に載っているのですが、雑誌に載っているからといっていいサンプルではないのですね、、、、、 一応アクションスクリプトは少しできるので自信があったのですが、結構難しいですね。それでラッパー関数というのはどうゆう関数の事なのでしょうか?googleやオンラインマニュアルで検索してみたのですが、わかりませんでした、、 あと「文字列を復帰する関数」という言葉の意味も、わかりませんでした。(いってしまえば後半部分全てで、本当に申し訳なく思うのですが) 時間があるときにいつでもかまいませんので、教えていただけますでしょうか。 また話が変わるのですが、がるさんがオススメできるPHPの書籍等がありましたら教えて下さい!

関連するQ&A