Unknown::Programming このページをアンテナに追加 RSSフィード

2009-07-16 歯牙

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

閉じタグってのは「?>」のことね。未だに閉じタグ使ってるコードを見ると一瞬ドキッとするんだよね。(自分の昔のコードも含むw)

いや、ちゃんとわかってて確実に使いこなしてるならいいんだけどたまに

-- ここがファイルの先頭 -- 
<?php

class Foo {
    // いろいろ
}

?>

-- ここがファイルの後尾 -- 

みたいな感じで閉じタグの後に改行コードが一つ入ってたりするのを見ると「あわわわ」ってなっちゃう。

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

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

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

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

最終的にHTMLを出力するだけの処理なら改行コードの一つや二つ混入しちゃっても表示上問題出ないし、まいっかー(いい感じ〜)ってなるかもしんないけど、header関数とかでヘッダ出力してる場合は先に改行コードが出力されてしまうため、ヘッダの出力が有効にならなくなっちゃうので爆危険。例えばリダイレクトとか動かなくなる。

-- ここがFoo.class.phpの先頭 -- 
<?php

class Foo {}

?>


-- ここがFoo.class.phpの後尾 -- 
<?php

// Foo.class.phpをrequire_onceした時点で改行コードが表示されてしまう。
require_once 'Foo.class.php';

// ヘッダ出力より先にデータが表示されてしまったため、このリダイレクトはうまくいかない!
header("Location: index.html");

?>

ってことで、閉じタグは省略しても良い仕様なのでじゃんじゃん省略した方がヘタなバグ混入を避けるという意味で良いと思います。



追記

Zend Frameworkコーディング規約においては、「使わない方が良い」ではなく、「決して使うな」と書いてますね。

paselapasela 2009/07/16 13:11 Zend Frameworkだかのコーディング規約だと閉じタグは書かないことになってますね。
ちなみに今、ファイルの先頭にBOMが入ってるやつがあって泣いてます。

fbisfbis 2009/07/16 14:35 > Zend Frameworkだかのコーディング規約だと閉じタグは書かないことになってますね。
なるほどー。読んだことないので読んでみます。

gosshujingosshujin 2009/07/16 17:52 マジデスカ・・・。今まで知らなかったので参考になりましたですぢゃ。ありがとうございます。

unauunau 2009/08/03 10:43 php の閉じタグって省略できるんですね。賢くなりました、ありがとうございます。
http://d.hatena.ne.jp/unau/20070705/1186888448

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証