php ヒアドキュメント構文を使う

複数行の文字列を表示したり、変数へ代入する場合は、ヒアドキュメント構文を使うと便利です。

ヒアドキュメントの構文

構文の2行目から識別子;の前までの文字列(破線部分)を、代入先へ代入します。
識別子は、代入する文字列の内に含まれない文字で決めます。
構文の終端は、半角セミコロンですが、
・終端行の決まりとして、空白を空けずに行の始めから「識別子+半角セミコロン」のみで、空白その他文字記号等は一切記述できません。

文字列をその場で表示する場合

代入先の部分は、 「echo」 や「 print」

【記述例】
(識別子は、End of Testと言う意味で「_EOT」にしてます。
文字列内に出現しないもので適当に決めてください)

echo <<< _EOT
今日は、雨です。<br>
明日は、曇りでしょう。<br>
_EOT;

【結果】
今日は、雨です。
明日は、曇りでしょう。

文字列を変数へ代入する場合

代入先の部分は、「変数名 =」
【記述例】

$tenki = "昨日は、晴れでした。<br>\n";
$tenki = <<< _EOT
今日は、雨です。<br>
明日は、曇りでしょう。<br>
_EOT;

echo $tenki;

既に変数に値が入ってる場合は、上書きされます。

【結果】
今日は、雨です。
明日は、曇りでしょう。

文字列を変数へ追加代入する場合

代入先の部分は、「変数名 .=」
【記述例】

$tenki = "昨日は、晴れでした。<br>\n";
$tenki .= <<< _EOT
今日は、雨です。<br>
明日は、曇りでしょう。<br>
_EOT;
echo $tenki;

既に変数に値が入ってる場合は、その後へ追加書き込みされます。

【結果】
昨日は、晴れでした。
今日は、雨です。
明日は、曇りでしょう。

ヒアドキュメント内に変数を展開

ヒアドキュメント構文では、代入する文字列全体をダブルクォートで囲った扱いになる為
文字列内に変数を埋め込みば、その部分に変数の値が展開されます。
例として以下の様に記述すると、

$array = array( 0=>23, 1=>16, 2=>55 );
$i = 1;
$price = 125;
print <<< _EOT
パンは1つ${price}円です。<br>
配列の2は、${array[2]}です。<br>
配列の${i}は、${array[$i]}です。<br>
_EOT;

【結果】
パンは1つ125円です。
配列の2は、55です。
配列の1は、16です。

注意!:変数を埋め込む場合は、必ず変数名に関係する部分全て(添字も含めて)を{}で括るようにします。
{}で括らない場合は、変数に関係する部分の抽出がPHP任せになるので、予定外の変数名を勝手に埋め込み変数にされたりすることがあります。

ヒアドキュメント構文を使うまとめ

ヒアドキュメント構文を使うと実践では、以下の様に重宝することが多いです。

// 式で変数への代入
$login_html  = "<p>通常の変数へに代入</p>\n";
$login_html .= "<form action=\"${_SERVER['PHP_SELF']}\" method=\"POST\">\n";
$login_html .= "ユーザーID:<input type=\"text\" name=\"UserID\" placeholder=\"ユーザーIDを入力\"><br>\n";
$login_html .= "パスワード:<input type=\"password\" name=\"Password\" placeholder=\"パスワードを入力\"><br>\n";
$login_html .= "      <input type=\"submit\" value=\"Login\"><br>\n";
$login_html .= "</form>\n";

echo $login_html;



// これがスッキリ置き換えることが出来ます! ↓ ↓ ↓

// ヒアドキュメントで変数へ代入
$login_html = <<< _EOT
<p>ヒアドキュメントで変数へ代入</p>
<form action="${_SERVER['PHP_SELF']}" method="POST">
ユーザーID:<input type="text" name="UserID" placeholder="ユーザーIDを入力"><br>
パスワード:<input type="password" name="Password" placeholder="パスワードを入力"><br>
      <input type="submit" value="Login"><br>
</form>
_EOT;

echo $login_html;

【ブラウザでの表示結果】

ソースコードを確認してみると
同じで問題ありません!

このように、見た目も分かりやすく余計なエスケープ処理を付ける必要も減り、コーディング段階で能率を上げることが出来ます。