モノノフ日記

普通の日記です

PHP基礎文法最速マスターの補足


id:shin1x1 さんがPerlRubyに続いてPHP基礎文法最速マスター - Shin x blogで基礎文法をまとめてくれています。ありがとうございます。空いた時間で書いてみようかなと思っていたら先越されてしまいました。

記事を読んでみてコードブロックの説明を最初読んだときに少し違和感があったので、はてブのコメントで参考資料を補足しておきましたが、他の方からも同様にも指摘されてますのでもう少し補足しておきます。
コードブロックの説明は下記のように書かれてます。

PHPコードは「<?php」という開始タグから始まります。
終了タグは「?>」です。HTMLにPHPコードを埋める際は終了タグを使いますが、ライブラリのようにPHPコードのみを記述する際は終了タグを省くことが慣例となっています。

PHP基礎文法最速マスター - Shin x blog

「慣例」だと説明としては弱いですね。。閉じタグをつけない方が好まれてるのにはちゃんと理由があって、Zend Frameworkコーディング規約では次のように解説されています。

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

Zend Framework

ファイルの最後にある空白文字が出力に影響するケースは下記ブログで解説されてます。
PHPの閉じタグは心の臓に悪いから使わないで - Unknown::Programming
ブログから一部を抜粋しますと、

実際には改行一つだけなら問題は出ない、PHPは閉じタグの直後の改行を消してくれるからね。

問題は改行が二つ以上あった場合だ。これは悲惨なことになる。PHPは閉じタグ以降のデータ(というか範囲外のデータ)は全部HTMLとして出力される仕様なので、改行コードが表示されちゃう事態に。

表示されちゃうっていうのは語弊があるか、元々PHPはHTMLに埋め込むための言語なのでの範囲外の文字列が表示されるのは当たり前の動作だからね。

でもだ、もしrequire_onceして利用するライブラリファイルに改行コードが混入しちゃったりしちゃってたら相当ヤバイ。マジヤバイ。危険。超危険。

PHPの閉じタグは心の臓に悪いから使わないで - Unknown::Programming

このような理由からPHPコードのみからなるファイルでは閉じタグは使わないようにしましょう。

追記

id:ghostbass さんからブコメでUTF-8のBOMについての指摘をいただきました。確かに気づきにくくハマりどころです。ご指摘ありがとうございます−!

UTF-8のBOMにも注意。エディタ上は見えないし、普通にHTML表示をしている分には(終了タグ以降の空白、改行ほどには)あんまりはまらないけどAMFとかのバイナリなプロトコルではまる。