PHPの最後の終了タグ ?> は付けないでおこうねというお話

この記事は昨年2015年11月に書いたものを修正した記事です。
現在は古い情報となっている可能性がありますので、ご注意ください。

こんにちは。とみっちです。

何年か前に会社勤めしていた際、

PHPの終了タグは付けてはダメ!!!

って言われたのが衝撃的だったので、改めて書いてみます。

PHPの開始タグと終了タグ

PHPではおなじみのこの構文↓

<?php



?>

PHPを動作させるために必要な記述ですよね。

実はPHPの終了タグは省略することが可能なのです!

PHPの終了タグは省略可能

ファイル全体が純粋なPHPコードの場合、PHPの終了タグである

?>

という記述は、省略してもプログラムは動作します。

しかしHTMLテンプレートなどに、

<h2>見出し</h2>
 <p>テキストテキスト…</p>
 <p><?php echo $variable_text; ?></p>

といった感じで、PHPの構文を差し込んで使用する場合は省略できません。

PHPのフレームワークによっては、コーディング規約に終了タグを記述しないように書かれていることもあります。

Zend Frameworkの場合

Zend FrameworkのPHP標準コーディング規約には、以下のように書かれています。

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

と、PHPコードのみのファイルでは終了タグを書かないことを定めています。

PHPの終了タグは「省略できる」という曖昧な決まりではなく、「省略しなければいけない」っていう厳格な仕様にしてよって思います。しかしHTMLの記述の中に、PHPの記述を差し込められるという便利な仕様があるため仕方ないですね。

PHPの終了タグ以降の改行タグで問題が起きることも

PHPの終了タグを省略しないことで問題が起こる事例を紹介します。

PHPの終了タグの直後の改行コードは1つだけ無視されるのですが、2つ以上記述されていると認識されてしまいます。

PHPの終了タグ直後に複数の改行コードが見られる悪い例

<?php
  // includeファイル
  // なんか色々書いているとします
?>[許容される改行]
[ここに無駄な改行]
[EOF]

例として紹介するこのPHPファイルでは、PHPの閉じタグ?>の後に改行コードが2つあります。[EOF]はEnd Of Fileの略で、ファイル内での終了箇所です。

こういうファイルを使用すると、プログラムが誤作動する場合があります!!

例えばheader()関数を使用する場合、関数のコール前に改行コードなどの出力があるとエラーとなるので注意が必要です。

また、HTMLでは改行コードを半角スペースとして認識するので、出力された結果おかしな空白に悩まされる原因ともなります。

以下のように「許容される改行」が1つのみでPHPファイルを記述できていれば問題はないんですけどね。

<?php
  // なんか色々書いているとします
?>[許容される改行]
[EOF]

PHPの最後の終了タグ ?> は付けないでおこう

何かの拍子に改行タグを打ち込んでしまう可能性がありますので、ファイル全体が純粋なPHPコードの場合、PHPの最後の終了タグ「 ?> 」は付けないというルールで統一しましょう。

終了タグの後の改行コードに毎回気をつけるよりも、終了タグを省略した方がよっぽど楽ということですね!

ABOUTこの記事を書いた人

とみっち

数年前までバンド活動してました。現在はブログを運営して暮らしています。サウンドクリエイター、Webクリエイター。息子は4歳になりました。長野市出身。埼玉県本庄市在住。 【興味】音/Web/車(GolfV GTI等)/田舎/旅/酒 ※自然の音からデスメタルまで聴きます。 @tomicci 詳しいプロフィール 【運営サイト】 ザ サイベース おと風景