PHPマニュアルにも注意を促す記載はありますが、「なぜ」「どのような仕組み」でエラーになるか分かりません。
どなたかエラーになる理由をご解説いただけないでしょうか?
また、session_startやsetcookieも何らかの出力後にコールするとエラーになるのは同様の理由でしょうか?
よろしくお願いいたします。
>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言語の仕様です。
それはPHPの問題ではなくて、HTTPの問題だからです。
headerは、あくまでもヘッダーなので、HTTPのデータが出力される前に出力する必要があります。
cookieも同じくHTTPのデータに先んじて出力する必要があります。
sessionは結局cookieを使っていますので、setcookieと問題は同じです
早速のご回答ありがとうございます。
これまで「HTTPのデータ」を意識したプログラミングができていませんでした。
大変勉強になりました。ありがとうございます。
>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言語の仕様です。
詳細な解説ありがとうございます。
大変勉強になりました。
>ほかの言語では、PHPと違ってどこにヘッダーを書いても
>先頭にして出力されるので、エラーにする必要がないのです。
知りませんでした。。気がききますね。
専門的用語を使わず簡単に説明していると思ってください。実際の動作の話なだけです。
僕も実際に仕組み自体は理解していませんが、動作としては理解しているつもりです。
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通信を利用するものだと思います。
大変分かりやすいご解説ありがとうございます。
反面、HTTP通信について学ぶ必要があると痛感しました。
>「echo」という記述や、「<html>」という記述がhttp通信の一番初めに出力された場合、
>それは、HTML文章という判断をしているのだと思います。
私も同感です。
詳細な解説ありがとうございます。
大変勉強になりました。
>ほかの言語では、PHPと違ってどこにヘッダーを書いても
>先頭にして出力されるので、エラーにする必要がないのです。
知りませんでした。。気がききますね。