<?php を閉じてみる
Tweet
こんにちは、7月からphpを始めた細川です。
phpの作法で<?phpではじめたファイルを?>で閉じない、というものがあります。これまで、あまり考えずに従ってきたのですが、よく考えてみると「タグを閉じない」というのは直感的には不作法です。
検索して調べてみると、以下のような記事が見つかりました。
PHP コードのみからなるファイルでは、終了タグ ("?>") は決して含めてはいけません。これは必須なものではなく、 終了タグを省略することで、ファイルの最後にある空白文字が出力に影響することを防ぎます。
「決して」含めてはいけない。ということで、わりと大事のようです。
そこで、実際にタグを閉じると何がおこりうるのか調べてみることにしました。
まず、以下のようなphpファイルtest.phpを用意しました。
<html><body><?phpecho 'おはようございます';?></body></html>
出力結果は以下のようになります。
<html><body>おはようございます</body></html>
次に、別のphpファイルfunctions.phpを用意し、それをrequireで読み込んでみます。
<?php
function hoge(){}
?>
functions.phpファイルは?>で閉じていますが、ファイル末尾にはなにもありません。
test.phpを以下のように変更します。
<html><body><?phprequire('functions.php');echo 'おはようございます';?></body></html>
この場合、出力結果は、以下のようになります。
<html><body>おはようございます</body></html>
この場合には何も余分なものはつかないようです。
次に、閉じタグの後ろに改行をいれてみました。その場合の出力結果が以下です。
<html><body>おはようございます</body></html>
改行だけでは問題ないようです。
改行を2つ入れてみました。
<html><body>おはようございます</body></html>
改行が1つ挿入されました。
閉じタグの後ろに4つスペースをいれます。
<html><body> おはようございます</body></html>
スペースが挿入されました。
最後に閉じタグ無しで末尾に4つスペースをつけた場合です。
<html><body>おはようございます</body></html>
当然といえば当然ですが、大丈夫ですね。
閉じタグ以降に改行だと2つ以上から、スペースだと1つ以上あると、出力に影響するようです。
必ずしも閉じタグをつけたからといって出力に影響が出るとは限らないようですが、事故防止のためには閉じない方が良さそうですね!
採用ページをご覧になり、興味のある方はぜひご応募ください。

コメント
HTMLの場合は、まだマシですが、
PHPで出力するのはテキストだけではないですよね。
その場合、余計な空白が致命的になり得ます。
良さそう、というレベルで認識しないほうが身のためですよ。
投稿者: えーと | 2010年12月20日 18:23
処理の最後でheader("Location~")を使う場合で、閉じタグ(?>)後の空白が影響して『Cannot modify header information - headers already sent』になるのがポピュラーなエラー例かと。
さらに、このエラーはWarningなので危険です。
投稿者: 高橋 | 2010年12月20日 18:40
-------------------
a.php
-------------------
<?php
require_once ('b.php');
header("Content-Type: application/csv");
echo "name,id\n";
-------------------
-------------------
b.php
-------------------
<?php
?>
-------------------
上記のようなときにheaderより前に改行が出力されているので問題になります。
Locationが失敗したりすることが多いとは思います
投稿者: あきら | 2010年12月20日 18:49
ご指摘ありがとうございます。
HTMLとは限らないっていうのは、全くもっておっしゃるとおりですね!だからこその、「決して」というわけですね。
投稿者: shinichi | 2010年12月20日 19:24
閉じタグだけでなく、開始タグも省略出来ればいいのに。
投稿者: okinaka | 2010年12月21日 00:35
開始タグを省略できるようにするには、PHPの命令のみを使用できる(逆にHTMLは一切使用できない)ファイル専用の拡張子が必要ですね。
現時点では、PHPの命令とHTMLタグとを混在して使えなくなるデメリットがあります。
投稿者: satoru yoshida | 2010年12月27日 11:04