PHPでechoなどの出力をした後に、header関数をコールするとPHPエラーが出ます。

PHPマニュアルにも注意を促す記載はありますが、「なぜ」「どのような仕組み」でエラーになるか分かりません。
どなたかエラーになる理由をご解説いただけないでしょうか?
また、session_startやsetcookieも何らかの出力後にコールするとエラーになるのは同様の理由でしょうか?
よろしくお願いいたします。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2011/04/13 21:33:28
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:taroe No.2

回答回数1099ベストアンサー獲得回数132

ポイント35pt

>session_startやsetcookieも何らかの出力後にコールするとエラーになるのは同様の理由でしょうか?

session_startはエラーになりません。エラーなった場合はほかの原因です。

setcookieはその通りです。

http://php.net/manual/ja/function.setcookie.php

>「なぜ」「どのような仕組み」でエラー

すでに文字が出力されている状態で

header関数を呼び出すとエラーになるようにPHPが作られてるからです。

なぜエラーになるように作られてるかというと

http通信の仕様で、htmlの本文の前にないと駄目だからです。

エラーにしないと、ヘッダーに書き込んでるつもりがそうでないと気づけないからです。

http://www.tohoho-web.com/ex/http.htm

ほかの言語では、PHPと違ってどこにヘッダーを書いても

先頭にして出力されるので、エラーにする必要がないのです。

PHP言語の仕様です。

id:sasaki0822

詳細な解説ありがとうございます。

大変勉強になりました。

>ほかの言語では、PHPと違ってどこにヘッダーを書いても

>先頭にして出力されるので、エラーにする必要がないのです。

知りませんでした。。気がききますね。

2011/04/13 21:27:48

その他の回答2件)

id:fonya3 No.1

回答回数238ベストアンサー獲得回数10

ポイント23pt

それはPHPの問題ではなくて、HTTPの問題だからです。

headerは、あくまでもヘッダーなので、HTTPのデータが出力される前に出力する必要があります。

cookieも同じくHTTPのデータに先んじて出力する必要があります。

sessionは結局cookieを使っていますので、setcookieと問題は同じです

id:sasaki0822

早速のご回答ありがとうございます。

これまで「HTTPのデータ」を意識したプログラミングができていませんでした。

大変勉強になりました。ありがとうございます。

2011/04/13 21:25:10
id:taroe No.2

回答回数1099ベストアンサー獲得回数132ここでベストアンサー

ポイント35pt

>session_startやsetcookieも何らかの出力後にコールするとエラーになるのは同様の理由でしょうか?

session_startはエラーになりません。エラーなった場合はほかの原因です。

setcookieはその通りです。

http://php.net/manual/ja/function.setcookie.php

>「なぜ」「どのような仕組み」でエラー

すでに文字が出力されている状態で

header関数を呼び出すとエラーになるようにPHPが作られてるからです。

なぜエラーになるように作られてるかというと

http通信の仕様で、htmlの本文の前にないと駄目だからです。

エラーにしないと、ヘッダーに書き込んでるつもりがそうでないと気づけないからです。

http://www.tohoho-web.com/ex/http.htm

ほかの言語では、PHPと違ってどこにヘッダーを書いても

先頭にして出力されるので、エラーにする必要がないのです。

PHP言語の仕様です。

id:sasaki0822

詳細な解説ありがとうございます。

大変勉強になりました。

>ほかの言語では、PHPと違ってどこにヘッダーを書いても

>先頭にして出力されるので、エラーにする必要がないのです。

知りませんでした。。気がききますね。

2011/04/13 21:27:48
id:nink No.3

回答回数16ベストアンサー獲得回数1

ポイント22pt

専門的用語を使わず簡単に説明していると思ってください。実際の動作の話なだけです。

僕も実際に仕組み自体は理解していませんが、動作としては理解しているつもりです。

headerは全ての出力前に設定しなければなりません。

以下のPHPプログラムはエラーになります。

<?php
echo "test";
header("Location: http://google.co.jp/");

以下であればエラーになりません。(「test」とは表示もされずgoogleに転送されます)

<?php
header("Location: http://google.co.jp/");
echo "test";

僕が思うに、headerはhttp通信の初めにチェックされる部分であり、

「echo」という記述や、「<html>」という記述がhttp通信の一番初めに出力された場合、

それは、HTML文章という判断をしているのだと思います。

それを明確に変更したり、追加要素を加えたい時にheaderが必要になっていると考えてまして、

例えば、以下の文章の場合、文章をPDFとして評価されますし、(「これはPDFです」という文章は表示されるかどうか検証してません)

<?php
header('Content-type: application/pdf');
echo "これはPDFです";

以下の場合は、Not Foundとなり、ページの表示がされません。「これはエラーになります」という文章も表示されないはずです。

<?php
header("HTTP/1.0 404 Not Found");
echo "これはエラーになります";

このように、headerは出力前に指定出来るものです。

headerの後に出力されるものが“何なのか”を明確に出来ます。

Cookieもhttp通信を利用するものだと思います。

id:sasaki0822

大変分かりやすいご解説ありがとうございます。

反面、HTTP通信について学ぶ必要があると痛感しました。

>「echo」という記述や、「<html>」という記述がhttp通信の一番初めに出力された場合、

>それは、HTML文章という判断をしているのだと思います。

私も同感です。

2011/04/13 21:33:07

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません