PHPについての都市伝説。最終行の ?> の後の改行はオッケーだった。

今回の記事は前回の記事の続きです。

事の発端は、WP Total Hacksの最終行に改行があるぞと指摘を受けたとこからでした。

しかし、実際には改行を入れた覚えはないし実際にvim上でもtracでも改行はないし、いままでに不具合の指摘を受けたこともありませんでした。

でもGUIベースのテキストエディターで開くと最終行に改行が入ってるではないですかっ!

で、よくよく調べたら以下のような事実が判明。

  • POSIXでは行は必ず改行で終わることと定義されている。
  • vimのような由緒正しきテキストエディターは、この定義を忠実に守っていて、自動的に行の末尾に改行をつける。

しかし、これだとひとつ問題が。

PHPは、<?php ?> の外側は何でも出力してしまうので、viでphpスクリプトを書く時は手を打たなきゃイカン。

でも、それってPOSIXの定義に反しててちょっと不思議。

以上が前回の記事です。

先に結論

PHPのパーサーは、閉じタグの直後の改行を自動的に削除する仕様になっています。

したがって、

<?php
  // some action
?>
[EOF]

みたいなファイルをrequireしても全く問題はありません。

あと、以下のようなphpの出力結果は、

<?php echo '<div>'; ?>
foo
<?php echo '</div>'; ?>

こんな風に改行が抜け落ちます。

<div>foo
</div>

ということは?

vim で PHP ファイルを編集する時に、前回の記事で紹介したような設定やコマンドを実行することは不要です。

あと、終了タグを書いちゃいけないという記述のブログ記事がたくさんありますが、「終了タグの後に余分な文字列を書かない」と「終了タグを書かない」は、どっちも書かないように気をつけるという意味でおなじようなものなので、終了タグを書いちゃダメというのは言いすぎかなと。(マニュアルでも書かないほうが無難と表現しています。)

vim 等により勝手に入っちゃう改行は無視されるわけですから!

実際、WordPressコアに含まれるファイルの多くが、?>(改行)で終わっています。

改行にまつわるそもそもなお話。

最終行の終了タグ直後の改行が嫌われる根本的な原因は、GUIベースのテキストエディターが、改行をトリガーにして新しい行があるかのように表示するからではないかと思います。

でも、これはしょうがいない。改行入れた時に新しい行ができなかったらいつできんねん!?ってことですから。

一方で、gccのようにファイルの最後が改行じゃないとエラーを吐くシステムもあります。

なぜ gcc はファイルの最後に改行がないと警告を出すのか? – Schi Heil と叫ぶために

gccも行の最後は必ず改行であるべしという定義を守ってるんですね。

というわけで

まずは理解すべき点。

「テキストファイルの行末は必ず改行が入っているべき」と定義されています。

私は普段 vim でプラグインを開発しているので、閉じタグの直後に改行が入っています。

なので、テキストエディターで開くと「あほかっ!」と頭に血が上ることもあるかと思いますが、phpのパーサーはもとよりtrac、subverionなどのツール類でもEOF直前の改行は無視しており、これが正しい姿なので、暖かく見守ってあげて下さい。(笑)

とはいっても、余計な心配をかけないように、終了タグ自体を順次消していったほうがいいですね。

変な誤解を与えないようにという意味でphpの終了タグは消したほうがいいかなと思った次第です。

最後に

ちなみに、このように閉じタグ直後の改行は無視されるという結果オーライな事実が判明しましたが、私自身入れてはダメと思いながら知らないうちに入っていたというのが事の発端なので、私の不勉強が諸悪の根源です。

すいませんすいません。