[PHP]ヒアドキュメント内で関数を使う

Pocket

PHP で HTML などを複数行表示させたい時、ヒアドキュメントを用いることが多いですが、
出力時に htmlspecialchars() 等の関数を使っておく必要が有る場合が殆どで、
現実的には次のようなソースになってしまいます。

<?php
//実際には動作しません
$str1 = getSomeText();
$str2 = getSomeText();

$str1 = htmlspecialchars($str1, ENT_QUOTES);
$str2 = htmlspecialchars($str2, ENT_QUOTES);

echo <<<EOD
<p>{$str1}</p>
<p>{$str2}</p>
EOD;
exit;

「<p>{htmlspecialchars($str1)}</p>」のように出来れば楽なのですが、ヒアドキュメント内で関数は直接使えないため、
前もって処理しておく必要があります。
例では2つしか無いのでこれでもいいですが、何十個も処理するのはあまり綺麗とはいえません。

解決方法は2つあり、ひとつはこちらの記事(http://blog.half-moon.org/archives/390)で知ったメンバ関数を経由する方法です。

<?php
class Foo {
  function h($str){
    return htmlspecialchars($str, ENT_QUOTES);
  }
}

$foo = new Foo();
$str = "<'sample'>";
echo <<<EOD
	<p>{$foo->h($str)}</p>
EOD;
exit;

このようにするとメンバ関数は展開されるので見た目をすっきり書くことができます。

もう一つは可変変数を使う方法です

<?php
$h='htmlspecialchars';
$str = "<'test'>";
echo <<<EOD
<p>{$h($str, ENT_QUOTES)}</p>
EOD;
exit;

クラスを作らなくていい分短いソースでできますが、
なんとなく落ち着かないのは私だけでしょうか?

どちらの方法もややトリッキーな方法であるため、複数人で作業する場合などは
通常通り出力前に変換しておく方法をとったほうが無難かもしれません。
あくまでこういう方法もあるという紹介にとどめておきます。


Similar Posts:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です