読者です 読者をやめる 読者になる 読者になる

MANA-DOT

PIXEL ART, PROGRAMING, ETC.

PHP Badparts 2.PHP

前回は初めてのあまり、思うことをダラダラ書きすぎて長くて読みづらいエントリになってしまいました。書く側も読む側もPHPのために無駄な時間を使いたくないと思われるので、もっと簡潔な文章を心がけます。

ScreenClip

PHPタグ

PHPタグ PHPでプログラムを書くためには、<?php ?>というHTMLのタグを意識した文字列を記述しなければなりません。

これは、おそらく最初期のPHPでは「多機能なHTMLのテンプレートエンジン」のような使い方を想定していて、気軽に

<h1>
<?php echo "今日は".date('Y年m月d日')."です!"; ?>
</h1>

と言った記述をするためであったのでしょう。PHPは「PHP: Hypertext Preprocessor」の略称ですし。 しかし、時は流れこのような記述は好まれなくなり、大規模な開発では

<?php
...

と先頭にタグを書くだけのスタイルで記述することが多いです。 この際に、元々の使われ方を想定していたPHPタグの性質の幾つかが問題となってきます。

タグの外の文字列は問答無用で出力する。

この性質は、先述したとおり、「複雑なことができるHTML」的にPHPを記述するためですが、先頭にPHPタグを書いて以降はコードしか書かないスタイルの場合は枷としかなりません。

ひどい例で、実際遭遇したことがあるのが、PHPタグの前にUTF-8のBOMが入っていて、そのPHPファイルをrequireしたすべてのプログラムで最初にBOMが出力されてしまうというものでした。厄介なことに、BOMはテキストエディタで視認できないため、原因発覚がやや遅れてしまいました。

php-tag

このような意図しない文字列の出力を防ぐために、マニュアルでは純粋なコードの場合は終了タグを記述しないことを推奨していますが、開始タグの前の文字列は人間が注意する以外に方法がありません。

プログラムの見た目上の構造を破壊した記述ができる

以下は有効なPHPコードです。

<?php
if ($hoge) {
  >?
  <p>Hogeはtrueです。</p>
  <?php
}
...
<?php
function printBr() {
  >?
  <br>
  <?php
}
...

phpタグの挙動を理解してくると、こいつはほとんど「出力を行うヒアドキュメント」のようなものであると考えることができます。そのため、上のようなコードは正しいのですが、それぞれプログラムの {} と交差しており、見た目の構造上はわかりにくくなっています。

HTMLと入り乱れたコード

上の「プログラムの見た目上の構造を破壊した記述ができる」とほぼ一緒ですが、 PHPのコードとHTMLを自在に入り乱れさせたコードが稀にあります。 コードの可読性を著しく落とすため、やめるべきです。

対策

多くの開発の場合、PHPファイルは純粋なコードのみであると思われます。 CIで先頭が <?php であり、それ以外にコード中で ?> がないことをチェックすればいいと思われます。 もしも、HTML中にタグ的にPHPを埋め込んでいるファイルが有る場合、そのファイルだけチェックから外すのが良いでしょう。

HTMLを出力する場合はテンプレートエンジンを利用するか、それができない場合は「ロジック用のPHP」と「HTML用のPHP」にしっかりと分けるべきでしょう。

雑感

この機能を見ると、PHPってやっぱりプログラミング言語じゃなくて「多機能なHTMLのテンプレートエンジン」なんだなって思います。 それなのにSmartyを始めとするテンプレートエンジンが存在するのは本末転倒だなあと思ってしまいます。

テンプレートエンジンといえば、最近触った中ではPlay frameworkのテンプレートエンジンがダントツで使いやすかったです。しっかり構造があると安心してコードが書けますね。