HTML からの脱出
PHP のパーサは、開始タグと終了タグに囲まれていない部分をすべて無視します。
そのおかげで、PHP のファイルにそれ以外のコンテンツを混在させることができるのです。
たとえば PHP を HTML ドキュメントに組み込んで、テンプレートを作ったりすることもできます。
<p>この部分は PHP から無視され、そのままブラウザには表示されます。</p>
<?php echo '一方、この部分はパースされます。'; ?>
<p>この部分も PHP から無視され、そのままブラウザには表示されます。</p>
これは期待通りに動作します。なぜなら、PHP インタプリタは ?> 終了タグを見つけると
それ以降新たに開始タグを見つけるまでの内容を何でも出力するからです
(終了タグの直後の改行は別です。
命令の分離
を参照ください)。
しかし、PHP が条件文の中にいる場合は話が別です。
その場合は、まず条件式の結果を判定してから何をスキップするかを判断します。
次の例を参照ください。
条件文を使った例です。
例1 条件文を使った高度な脱出
<?php if ($expression == true): ?>
条件式が真の場合にこれが表示されます。
<?php else: ?>
それ以外の場合にこちらが表示されます。
<?php endif; ?>
この例では、PHP は条件を満たさないブロックを処理しません。たとえそれが
PHP の開始タグと終了タグに囲まれた部分でなくても、条件文にしたがってそこを読み飛ばします。
というのも、PHP のインタプリタは条件を満たさない箇所をブロックごと読み飛ばすからです。
大量のテキストを出力する際に
echo や print
を用いることを考えると、このように一度 PHP のパースモードを抜けるほうが効率的です。
PHP で用いられるタグは 4 種類あります。
これらのうちの 2 つ、<?php ?> と
<script language="php"> </script> は常に使用することができます。
残りの 2 つは短縮型のタグと ASP スタイルの
タグで、これらは php.ini ファイルによって有効か無効かを切り替えられます。
中には短縮型のタグや ASP スタイルのタグを
便利に感じる人がいるかも知れませんが、長いタグに比べると移植性に欠けます。
また一般的には推奨されていません。
注意:
さらに注意しなければならないことがあります。PHP コードを XML や XHTML に
埋め込む場合には、標準規格に従うために <?php ?> タグを使用する
必要があるでしょう。
例2 PHP の開始タグと終了タグ
1. <?php echo 'XHTMLまたはXMLドキュメントを処理したい場合は、この方法が良いでしょう'; ?>
2. <script language="php">
echo '(FrontPageのような) いくつかのエディタ は処理命令を好み
ません';
</script>
3. <? echo 'これは、SGML を処理する最もシンプルな方法です'; ?>
<?= expression ?> This is a shortcut for "<? echo expression ?>"
4. <% echo 'オプションでASP形式のタグを使用可能です'; %>
<%= $variable; # これは、"<%echo .." のショートカットです。%>
例の 1. と 2. のタグは常に利用可能です。中でも 1. のタグは最も一般的で
推奨される方法です。
短縮型のタグ(例 3.)が有効なのは、php.ini 設定ファイルのディレクティブ
short_open_tag が
有効になっている場合か PHP が --enable-short-tags
オプションつきで configure されている場合のみです。
ASP 型のタグ(例 4.)が有効なのは、
php.ini 設定ファイルのディレクティブ
asp_tags が有効になっている場合のみです。
注意:
再利用されるか、または、自分の制御下にないPHPサーバーで運用される
アプリケーションまたはライブラリを開発する場合、短縮型のタグの
使用は避けるべきです。これは、短縮型のタグがターゲットサーバー
でサポートされていない可能性があるためです。
可搬性のある、再配布可能なコードでは、短縮型のタグを使用しない
ようにしてください。
注意:
PHP 5.2 以前では、開始タグ <?php
だけを書いてそれ以外に何も書いていないファイルは
パーサが処理することができませんでした。PHP 5.3
以降では、開始タグの後に空白が一文字でもあればそのようなファイルもパースできます。
注意:
PHP 5.4 以降では、短い形式の echo タグ <?= は常に有効なタグとして認識されるようになりました。
short_open_tag の設定には影響を受けません。