PHPのヒアドキュメントは便利ですよね。
ただ1つ問題があって、それはヒアドキュメント内では純粋な変数しか展開できないことです。普通の書き方ではクラス変数や関数あるいは式は書くことができません。
ということでその対処法となるコードを紹介します。
ヒアドキュメントのおさらい
今さら説明するまでもないかもですが一応ヒアドキュメントについて少し説明します。
まずヒアドキュメントというのは長~い文字列を表示したり代入したいときに使われる構文です。
例えば次がヒアドキュメントの使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** 長い文字列を表示したり */ echo <<< EOM I have a pen. I have an apple. I have a pineapple. EOM; /** あるいは代入も可能 */ $joke = <<< EOM I have a pen. I have an apple. I have a pineapple. EOM; |
EOMとかがヒアドキュメントの開始と終了の記号として使われることが多いです。
それでこの中で変数を展開するには次のように変数を {} で囲みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$pen = 'pen'; $apple = 'apple'; $pineapple = 'pineapple'; echo <<< EOM I have a {$pen} I have an {$apple} {$apple} {$pen} I have a {$pen} I have an {$pineapple} {$pineapple} {$pen} EOM; |
変数が展開できるので便利です。
ただ次のようにクラス変数とか式は {} 内には書けないんですよね・・・
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/** テスト変数 */ $a = 1; $b = 1; /** テストクラス */ class Hoge{ const NUM = 100; public static function f(){ return 'HogeHoge'; } } echo <<<EOM {$a} + {$b} = {($a + $b)} Hoge::NUM = {Hoge::NUM} Hoge::f() = {Hoge::f()} EOM; |
これがどのような結果になるかというと普通に文字列として出力されるだけです。
1 2 3 |
1 + 1 = {(1 + 1)} Hoge::NUM = {Hoge::NUM} Hoge::f() = {Hoge::f()} |
じゃあクラス変数とか式を書くのは諦めるしかないかと言うとそうではありません。
ちゃんと解決策があります。
式・クラス変数・関数を書くための解決策
その解決策とは何かというと次のような関数変数を作ることです。
1 2 3 |
$wrap = function( $expression ){ return $expression; }; |
見てわかるように渡された変数をただ単に返しているだけの関数です。
それでこれをどのように使うかというと例えば次のコード例のようにして使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/** 渡された変数を返す関数変数 */ $wrap = function( $expression ){ return $expression; }; /** テスト変数 */ $a = 1; $b = 1; /** テストクラス */ class Hoge{ const NUM = 100; public static function f(){ return 'HogeHoge'; } } echo <<<EOM {$a} + {$b} = {$wrap($a + $b)} Hoge::NUM = {$wrap(Hoge::NUM)} Hoge::f() = {$wrap(Hoge::f())} EOM; |
$wrap($a + $b) とか $wrap(Hoge::NUM) とか $wrap(Hoge::f()) みたいにそのまま式や関数やクラス変数を書くだけです。
そしてこのコードの表示結果は次の通り
1 2 3 |
1 + 1 = 2 Hoge::NUM = 100 Hoge::f() = HogeHoge |
しっかりと展開されています。
これでまたヒアドキュメントの使い勝手が良くなりそうです。
ここまでのまとめ
簡単にここまでのことをまとめると次の通り
- ヒアドキュメントでは{}で変数を展開する
- ただクラス変数とか式は展開できない
- なので展開用の関数変数を作って解決
ただ展開用の関数変数を作るだけなので面倒なこともないですね。
というわけでヒアドキュメント内で変数以外を展開する方法を説明しました。
ヒアドキュメントを見やすくするためにも使えるテクニックじゃないかなと思います。
ではでは(^_^)/~~