PHPで関数内でもHTMLタグが盛り込めたという話

PHPののコーディングスタイルの話で今日WordPressのプラグインに関する記事をみてて自分ではちょっと驚いた記法があったのでメモしておきます。

タイトルのとおりですが、PHPで関数内でもHTMLタグが盛り込めたという話です。

コードを見ていただくのが早い

どういうことかというとコードを見ていただくのが早いです。


<html>
<head>
<title>タイトル</title>
</head>
<body>
<?php echo getHTMLSouceCode(); ?>

<?php
function getHTMLSouceCode () {
?>

<strong>getHTMLSouceCode:TESTCODE</strong>

<?php
}
?>

</body>
</html>

これを実行すると

<html>
<head>
<title>タイトル</title>
</head>
<body>
<strong>getHTMLSouceCode:TESTCODE</strong>
</body>
</html>

が出力されます。

知っている方ならなんてことはないのですが、私がびっくりしたのは
関数内で書かれているHTMLはPHPの開始タグと終了タグに入っていなくても関数の実行時に出力されている ということなんです。

つまり、上記のコードは以下と同義のことですね。


<html>
<head>
<title>タイトル</title>
</head>
<body>
<?php echo getHTMLSouceCode(); ?>

<?php
function getHTMLSouceCode () {
    echo '<strong>getHTMLSouceCode:TESTCODE</strong>';
}
?>

</body>
</html>

PHPマニュアルに説明があった

この挙動は、PHPマニュアルの「HTML からの脱出」の項、例1 高度なエスケープ処理にも触れられています。

PHP: HTML からの脱出 – Manual

・・・もっと複雑な構造を用いることもできます:

例1 高度なエスケープ処理

<?php
if ($expression) {
    ?>
    <strong>真です。</strong>
    <?php
} else {
    ?>
    <strong>偽です。</strong>
    <?php
}
?>

これは期待通りに動作します。なぜなら、PHP は ?> 終了タグを見つけると それ以降新たに開始タグを見つけるまでの内容を何でも出力するからです (終了タグの直後の改行は別です。 命令の分離 を参照ください)。

これはif文の挙動ですが、関数の挙動にも当てはまるわけですね。そして以下のように続きます。

しかし、大量のテキストを出力する際に echo() や print() を用いることを 考えると、このように一度 PHP のパースモードを抜けるほうが効率的です。

なるほど、HTML一式吐き出すとき煩わしい!

私に有用な用途とは、管理画面を作る工程でHTML一式吐き出すとき

たしかにコードとしては無理があります。使うシーンは少なそうです。

しかし、私にとってはWordPressのプラグインを制作する際に、独自の管理画面を作る工程でHTML一式吐き出す関数を作る箇所があり、そこではまさに大量のテキストを出力する際に echo() や print() を用いるケースが生じてドット . や “” や ” のクォーテーションが混在することになって困っていたのです。その煩わしさが、このコーディングを採用することで一気にやりやすくなりました。

今まで、HTMLコード中にphpのタグが書いてあるようなケースしか見ていなかったので「PHP のパースモードを抜ける」という視点で見るとこういった複雑なことができるのですね。日々勉強です。

それでは、良い PHP Life を。

参考記事

この記事を書く元になったPDFです。管理画面の作成方法としてとても参考になります。該当のコードは「options_page の例 (1)」のところ。
WordPressプラグインの作り方(管理パネル篇)(pdf)

この記事にもこのコーディングがそのまま使われています。
WordPressプラグインの作り方〜初級編 | カグア!

本家ではincludeするようなやり方のため触れられていませんが、まさにこの画面の挙動です。
設定ページの作成 – WordPress Codex 日本語版