警告の出力
2007/06/24
下のような問題が起こらないように、phpファイルの最後の ?> は書かないことが推奨されています。有名な話らしいです。
覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。
http://www.phppro.jp/phpmanual/php/function.header.html
出力がバッファされていれば、header関数の出力を先に出力することができるから php.iniのoutput_bufferingを調整することで回避することもできる、ということらしいです。
これはCGIとかHTTPとかを知ってれば当然の話なので、phpという言語の性質からしても特に違和感は感じません。個人でphpを書く場合には、?>を書かないのは、逆に気持悪いので、これからも書くつもりです。
phpを始めたばかりの時に違和感を覚えたのは、警告などのメッセージが画面(Webブラウザ)に出力される(しかも、headerも勝手に出力した上で)という動作がデフォルト(display_errors=On)になっているということでした。便利といえば便利ですが、お行儀が悪いと思います。真面目に使おうとしている他の言語のユーザが違和感を覚えるところではないかと思いました。