Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

ヒアドキュメント

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away