2008年01月04日

?>の後ろの改行

C/C++言語だと、最終行の"}"の後ろに改行コードを入れておかないとコンパイル警告になりますよね。

なんか、これが染み付いていて他の言語でコーディングする時も、同じノリで、最終行に改行コードを入れてしまうのですが、PHPの場合これが仇になるのですよね。

?>の後ろに改行を入れてしまっていると、
Warning: Cannot modify header information - headers already sent by (output started at XXXXXXXXXX.class.php:50) in XXXXXXXXXXXXXX.class.php on line 27

なんて、ことになる場合もあります。他のクラスファイルをインクルードした時に発生する可能性があるのですが、?>の後にある空行がレスポンスヘッダとしてブラウザに送信されてしまうためのようです。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 21:46| Comment(4) | TrackBack(0) | 技術メモ(PHP)
この記事へのコメント
はじめまして。
私もPHPをよく使うんですが、"?>"の後に改行するとエラーになるなんて初めて知りました。

先ほど自分の環境でも試しにやってみましたが、エラーにはならなかったみたいです。
もしかするとphp.iniの中のerror_reportingで何かあるのかも・・・。

ちなみに私は環境では下のようになっていました。
error_reporting = E_ALL & ~E_NOTICE

もしかするとPHP 4と5の違いかな??
Posted by かねやん at 2008年12月09日 00:31
はじめまして。台北猫々です。
コメントありがとうございますm(_ _)m

この現象は、多分フレームワークを使っていないと起こらないのかと。

私がこの現象に出くわしたのは、「Maple」(+PHP5)というフレームワークを使って開発していた時なのですが、
この後色々と調べている内に、「Zend Framework」のドキュメントに↓のように答えらしきものがありました。

「付録 B. Zend Framework PHP 標準コーディング規約」
http://framework.zend.com/manual/ja/coding-standard.php-file-formatting.html

=========
PHP コードのみからなるファイルでは、終了タグ ("?>") は決して含めてはいけません。これは必須なものではなく、 終了タグを省略することで、ファイルの最後にある空白文字が出力に影響することを防ぎます。
=========

「Zend Framework Programmer's Reference Guide:44.4.2. Error: Headers Already Sent」
http://framework.zend.com/manual/ja/zend.session.global_session_management.html#zend.session.global_session_management.headers_sent

=========
PHP のソースファイルの最後でこのエラーが発生するのなら、 終了タグ "?>" を削除しましょう。 これは不要です。また、終了タグの後に改行などの目に見えない文字があった場合、 それが出力としてクライアントに送信されてしまいます。
=========
Posted by 台北猫々 at 2008年12月09日 19:04
コードなにがしで参考にさせていただいております。

PHPの終了タグ「?>」以降に改行があるとエラーになりますが、これは結構はまります。
ひっかかるのはheader関数やsession_start関数でWARNINGですね。
「?>」以降に改行のあるファイルを読み込んでheader関数をたたくと・・・。

原因になる箇所を調べようとしてもこの知識がないとコードしか探さないので、すごくみつかりにくいことになります。

ただ、「?>」がないと違和感があるというプログラマが結構いて統一が難しいです。
自分は省略の癖がつき始めてしまいました。

このあたりの情報はできればどんどん広めたいですね
Posted by 夜行 at 2008年12月25日 14:38
私もはじめ、結構はまりました(^^;

こういう落とし穴的なもので、開発者の時間が浪費されないように、こういった情報は積極的に広げたいと、私も思いますね。
Posted by 台北猫々 at 2008年12月28日 10:10
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/9124711

この記事へのトラックバック