« Symfony2のFormsを使ってみる | メイン | EclipseでPHP開発 »

<?php を閉じてみる
このエントリーをはてなブックマークに追加 このエントリーをlivedoorクリップに追加

こんにちは、7月からphpを始めた細川です。

phpの作法で<?phpではじめたファイルを?>で閉じない、というものがあります。これまで、あまり考えずに従ってきたのですが、よく考えてみると「タグを閉じない」というのは直感的には不作法です。

検索して調べてみると、以下のような記事が見つかりました。

http://zendframework.com より引用


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

「決して」含めてはいけない。ということで、わりと大事のようです。
そこで、実際にタグを閉じると何がおこりうるのか調べてみることにしました。

まず、以下のようなphpファイルtest.phpを用意しました。

<html><body><?php
echo 'おはようございます';
?></body></html>

出力結果は以下のようになります。

<html><body>おはようございます</body></html>

次に、別のphpファイルfunctions.phpを用意し、それをrequireで読み込んでみます。

<?php

function hoge()
{
}

?>

functions.phpファイルは?>で閉じていますが、ファイル末尾にはなにもありません。

test.phpを以下のように変更します。

<html><body><?php
require('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つ以上あると、出力に影響するようです。

必ずしも閉じタグをつけたからといって出力に影響が出るとは限らないようですが、事故防止のためには閉じない方が良さそうですね!

Zynga Japanでは積極的にエンジニアを採用しています。
採用ページをご覧になり、興味のある方はぜひご応募ください。

トラックバック

このエントリーのトラックバックURL:
http://www.unoh.net/mt32/mt-tb.cgi/1902

この一覧は、次のエントリーを参照しています: <?php を閉じてみる:

» PHPの閉じタグは閉じなくて良いじゃなくて、閉じてはいけない! from Shoulder.jp
<?php を閉じてみる  phpの作法で<?phpではじめたファイルを?>で閉じない、というものがあります。これま... [詳しくはこちら]

コメント

HTMLの場合は、まだマシですが、
PHPで出力するのはテキストだけではないですよね。
その場合、余計な空白が致命的になり得ます。

良さそう、というレベルで認識しないほうが身のためですよ。

処理の最後でheader("Location~")を使う場合で、閉じタグ(?>)後の空白が影響して『Cannot modify header information - headers already sent』になるのがポピュラーなエラー例かと。

さらに、このエラーはWarningなので危険です。

-------------------
a.php
-------------------
<?php
require_once ('b.php');

header("Content-Type: application/csv");
echo "name,id\n";
-------------------

-------------------
b.php
-------------------
<?php

?>


-------------------

上記のようなときにheaderより前に改行が出力されているので問題になります。
Locationが失敗したりすることが多いとは思います

ご指摘ありがとうございます。
HTMLとは限らないっていうのは、全くもっておっしゃるとおりですね!だからこその、「決して」というわけですね。

閉じタグだけでなく、開始タグも省略出来ればいいのに。

開始タグを省略できるようにするには、PHPの命令のみを使用できる(逆にHTMLは一切使用できない)ファイル専用の拡張子が必要ですね。
現時点では、PHPの命令とHTMLタグとを混在して使えなくなるデメリットがあります。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


画像の中に見える文字を入力してください。