2021-06-18

PHPスクリプトのみのファイルは終了タグ(?>)は省略する。その理由、メリットとは

PHPに関する記事

PHPのスクリプトは、下記のように開始タグ<?phpと終了タグ?>の間に書きます。
しかし、実際の開発現場では、終了タグを省略し、記述しないことが主流です。その理由について説明します。

タグ省略時の実際の動作について

下記のコードはPHPコードの基本形です。

<?php
// 開始タグと終了タグの間に
// スクリプトを記述
?>
[EOF]

下記のように、タグの外に記述された文字列は、PHPのコードとは認識されず、文字列としてそのまま出力されてしまいます。

開始タグの外なので
echo "Hello.";
は実行されない。
<?php
// 開始タグと終了タグの間に
// スクリプトを記述
?>
[EOF]

そして、上記のように終了タグ?>をスクリプトの最後に記述するのが基本ですが、PHPスクリプトのみで構成されたファイルは、下記のように閉じタグ?>を省略することが可能です。

<?php
// スクリプトを記述
// 閉じタグを削除したが
// PHPのスクリプトのみで構成されている
// ファイルであれば問題なく動作する
[EOF]

省略できる?省略が望ましい?省略しなければいけない?

省略可能といいましたが、省略したほうがよいようです。
いや、省略したほうがよいといいましたが、Zend frameworkマニュアルサイトのコーディング規約には、省略しなければならないと明言されています。
フレームワークやプロジェクト単位ではコーディング規約で使用禁止を明確に定める場合もあるようです。

下記はZend frameworkマニュアルサイトのコーディング規約に関しての記述を参照しました。
終了タグを「省略できる」という中途半端な規約ではなく、「省略しなければいけない」という厳格な仕様が定められています。

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

https://framework.zend.com/manual/1.12/ja/coding-standard.php-file-formatting.html

なお、閉じタグの省略は、classファイルなどの純粋なPHPのみで構成されたファイルでの話です。
下記のようにHTMLファイルにPHPタグを埋め込む場合は、原則通り閉じタグは必要です。

<body>
<h2><?php echo $foo; ?></h2>
…

スポンサーリンク

閉じタグを省略するメリットとは

PHPの閉じタグを省略するメリット、理由は実際のところ何なのでしょうか。
下記のスクリプト例を見てみましょう。

header()関数を用いた例

外部ファイル(FooClass.php)を読み込み、処理後にheader()関数で遷移処理を行いたいが、外部ファイルFooClass.phpにスペースや改行があるとエラーが発生してしまいます。
(header()関数より前に何らかの出力があるとエラーが発生する)

FooClass.php

<?php
 // includeファイル
 // 何らかの処理
?>
[スペースや無駄な改行]
[EOF]

location.php

<?php
// 上記、FooClass.phpを読み込み
require('FooClass.php');

// 前のファイル読み込みで改行が出力されてしまった
header("Location: xxxxx.html");
?>

タグを省略するメリットは、スクリプトの誤作動というデメリットを避ける、といえるのではないでしょうか。

正直なところ、終了タグを記述したままで特に不利益やデメリットを感じたことはありませんでしたが、それではマナー違反、といった雰囲気があったのでわたしも省略するようになりました。作法のほうなものと捉えています。

まとめ

たしかに複数人で開発を進める際、誰かの改行が原因で動作しない、などという事態は原因の特定にも時間を要するので絶対に避けたいところ。コーディング規約で終了タグを禁止し、その通り実装すれば防げるので、非常に理にかなっていると思います。

また、上記の例であげたheader()関数の処理など、期待しているサーバからの指示が動作しないという事態ですので、プログラムとしてもかなり致命的です。やはり終了タグは省略すべきなんだ…!