Edited at

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

ヒアドキュメント

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

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