LoginSignup
6
3

More than 3 years have passed since last update.

PHP内のHTML/JSを含む複数行文字列がつらいとき

Last updated at Posted at 2019-08-01

ヒアドキュメント

function traditionalHereDoc()
{
    // $ を使うとき \ でエスケープが必要
    // でも PhpStorm の Language Injection で \$ はシンタックスエラー
    html(<<< HTML
<div class="abc"></div>
<script>
    \$(function() {
        var \$var = \$('.abc');
        \$var.text("123");
    });
</script>
HTML
    // 次のカンマを打つのに改行しないといけない
    , false);
}

function html($html, $encode = true)
{
    if ($encode) {
        $html = htmlspecialchars($html);
    }
    echo $html . "\n";
}

Q. 不愉快ですなんとかなりませんか?

A. 文字列リテラル内で改行できますよ

function multilineStringLiteral()
{
    // シングルクオート内でシングルクオートを使うときつらい
    html(
'<div class="abc"></div>
<script>
    $(function() {
        var $var = $(\'.abc\');
        $var.text("123");
    });
</script>', false);
}

A. 俺の文字列の囲み記号は ob_start ?><?php ob_get_clean だぜ

function outputBufferingTrick()
{
    // ハック臭がキモい。邪道
    ob_start();
?><div class="abc"></div>
<script>
    $(function() {
        var $var = $('.abc');
        $var.text("123");
    });
</script><?php
    html(ob_get_clean(), false);
}

最初にもどって、ヒアドキュメントを Newdoc <<< 'HTML' にするのがいちばんマシな方法か...

でも結局シュッとインデント揃わないし、終端マーカーのあと改行しないといけないし、てかむしろ、本当に欲しいのは Ruby 2.3 の <<~ なんですよわかってくださいよ。

PHP 7.3 がわかってくれた!

function php73FlexibleNewDoc()
{
    // $ を展開しないしインデントもできるし終端マーカーの後にコード書けるし最高
    html(<<< 'HTML'
        <div class="abc"></div>
        <script>
            $(function() {
                var $var = $('.abc');
                $var.text("123");
            });
        </script>
        HTML, false);
}

結論 = さっさと PHP のバージョンを 7.3 にしましょう。

参考: フレキシブルなheredocがやってくる - Qiita

かぶってるけど大事なことなのでじゃんじゃん上げていきますよ

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3