Search

検索したいワードを入力してください

2019年04月10日

PHPのヒアドキュメントの使い方とエラーについて解説

PHPで複数行にわたる文字列を変数に代入するには、ヒアドキュメントを使うと便利です。「\n」などの改行コードを書いたり、エスケープに気を遣わなくていいからです。しかし、使い方によってはバグのもとになるので、そのルールとエラーへの対処方法を解説します。

ヒアドキュメントとは

ヒアドキュメントは、複数行の文字列を変数に代入する場合などによく使います。普通の文字列と違い改行も埋め込むことができるので、より柔軟に文字列を扱うことができます。しかし、一定のルールがあるので注意が必要です。

ヒアドキュメントのルール

PHPのヒアドキュメントでは、「<<<」のあとに開始IDを記述し、そのあとに文字列を続けて書き、最後を開始IDと同じ名前の終端IDで閉じます。

<<<開始ID
文字列
終端ID;


また、終端 ID がある行にはセミコロン(;)以外の文字を書いてはいけません。つまり、インデントを行ったり、セミコロンの前後に空白やタブがあるとエラーになります。

IDの命名ルール

ID名には、「EOM(End of Message)」や「EOD(End of Document)」、「EOF(End of File)」などがよく使われますが、ルール内であれば何でもかまいません。

命名のルールについては、以下のように規定されています。
・IDは、文字か数字かアンダーバー(_)に限られる
・数字が先頭にきてはいけない
・日本語も使える
・開始IDと終端IDは必ず同じ文字列にしなければいけない

英数字およびアンダースコアのみを含み、 数字でない文字またはアンダースコアで始まる必要があります。

出典: https://www.php.net/manual/ja/language.types.string.php#l... |

ヒアドキュメントの基本的な書き方

PHPでヒアドキュメントを使って、開始IDと終端 IDの間の文字列を記述する方法は以下のとおりです。

<?php
echo <<<EOM
ここに、
表示させたい文字列を
入力します。
EOM;
?>

変数の展開

ヒアドキュメント内には変数を埋め込むこともでき、その変数は展開されます。
$name = "田中 一郎";
$pref = "大阪";
echo <<<EOM
私の名前は、$name です。
出身は、{$pref}です。
EOM;


結果は、
私の名前は、田中 一郎 です。
出身は、大阪です。
となります。

変数の認識について

変数の代入値を表示するには、変数の後ろに空白を入れるか、変数を{}で囲む必要があります。

上記の例で「私の名前は、$nameです。」と、空白や{}を入れずに続けて書くと、結果は「私の名前は、」で切れてしまいます。その理由は、「nameです。」までが変数名だと認識されて、変数の内容が空だと判断されるからです。

つまり、変数名が「name」であることを明示しておかなければいけません。

改行について

ヒアドキュメントの中では改行コード(\nや\r、\r\n)を書かなくても改行されます。ただし、ソースでは改行されますが、ブラウザでの表示は「私の名前は、田中 一郎 です。 出身は、大阪です。」と、「出身は~」の前に半角スペースが入るだけで一行で表示されます。そのため、ブラウザでも改行して表示するには、改行する前に改行タグの<br>を記述しておく必要があります。

配列の引数に代入

配列の引数にヒアドキュメントを使うこともできます。

<?php
$strings = [
<<<EOM
あいうえお
EOM
,
<<<EOM
かきくけこ
EOM
,
<<<EOM
さしすせそ
EOM
];

foreach ($strings as $str) {
echo $str.'<br>';
}
?>


結果は、
あいうえお
かきくけこ
さしすせそ
となります。

ここでひとつ注意しなければいけないのは、終端IDの後ろにカンマ(,)をつけるとエラーになることです。カンマは行を変えて書かないといけません。

HTMLタグも一緒に記述

PHPのヒアドキュメントは、文字列だけでなく、HTMLのタグも一緒に記述することができます。

echo <<<EOM
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>タイトル</title>
</head>

<body>
<p>ここに本文を記入</p>
</body>
</html>
EOM;

ヒアドキュメントの種類と使い方

PHPのバージョンが5.3以降の場合、ヒアドキュメントの開始IDにダブルクォートをつけるか、シングルクォートをつけるかによって挙動が変わります。

ダブルクォートを使ったヒアドキュメント

次に説明する「Nowdoc」と区別するために、開始IDの両端にダブルクォートをつけることも可能です。

ダブルクォートの使い方

開始IDの両端にダブルクォートをつける場合でも、ヒアドキュメントの記述方法はほぼ同じで、変数を展開することが可能です。

<?php
$number = 1234;
echo <<< "EOM"
会員番号は\t{$number}です。
EOM;
?>


結果は、
会員番号は 1234です。
となります。

シングルクォート(Nowdoc)を使ったヒアドキュメント

開始IDの両端をシングルクォートで括った場合は、変数やエスケープシーケンスが展開されずに、そのまま表示されます。そのため、文中の変数を展開したくない場合に、エスケープの必要がなくて便利です。

シングルクォートの使い方

先ほどの例をシングルクォートに置き換えてみます。

<?php
$number = 1234;
echo <<<'EOM'
会員番号は\t{$number}です。
EOM;
?>


結果は、
会員番号は\t{$number}です。
となり、変数が展開されないのがわかります。

終端IDは囲まない

終端IDをシングルクォートやダブルクォートで囲むと、終端IDではなく文字列として認識されるのでエラーになります。

PHPのヒアドキュメントでのクラスの展開

PHPのヒアドキュメントでは、直接クラスを展開することはできません。クラス名を代入した変数を定義し、その変数を展開してクラスのメソッドを呼び出す形となります。

ヒアドキュメント内での関数の利用

PHPのヒアドキュメント内では関数を使うことができません。そのため、関数をクラス化して変数に代入し、変数から関数を呼び出すことで、ヒアドキュメント内で関数が利用できるようになります。

例)htmlspecialcharsで特殊文字をHTMLエンティティに変換する

フォームなどからユーザーが悪意のあるスクリプトを送信しようとするのを防ぐために、特殊文字を意味を持たない単なる文字列に変換する場合を例にとって説明します。

<?php
class Hsc {
public function h($in){
return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
}
}

$hsc = new Hsc();
$str = '<a href="https://test.com/">test</a>';
echo <<<EOM
{$hsc->h($str)}
EOM;
?>

クラスの定義とヒアドキュメントでの使用

Classで定義した関数などをヒアドキュメント内で利用するには、クラス変数や式の展開用の関数を作ります。

クラスの定義

PHPの主なクラスの定義は以下のとおりです。

class Sample {
public $property = 'プロパティ';
function method () {
return 'メソッド';
}
static $static_property = 'スタティックプロパティ';
const CONSTANT = '定数';
static function static_method () {
return 'スタティックメソッド';
}
}

ヒアドキュメントでの利用の下準備

上記で定義したメソッドなどをPHPのヒアドキュメント内で利用する方法を説明します。
(1)インスタンスを作成
$obj = new Sample();
(2)クラス名を代入した変数を作成
$class_name = 'Sample';
(3)定数展開用の関数
function cst($constant){
return $constant;
}

(4)(3)の関数名を変数に代入
$cst = 'cst';

ヒアドキュメントでの呼び出し例

PHPのヒアドキュメント内での、それぞれの呼び出し方は以下のとおりです。

echo <<<EOM
$obj->property <br>
{$obj->method()}<br>
{$class_name::$static_property}<br>
{$cst($class_name::CONSTANT)}<br>
{$class_name::static_method()}<br>
EOM;

ヒアドキュメントでよくあるエラー

PHPでヒアドキュメントを扱う際には、いくつかのことに注意しなければエラーが発生します。ここでは、よくあるエラーについて説明します。

終端IDの後には改行を入れること

終端IDの後には必ず改行を入れなければいけません。改行がない場合は、「Parse error: syntax error, unexpected end of file in~」とファイルパスと最終行数が表示され、構文エラーが発生します。

終端IDの前後に文字列を入れてはいけない

終端IDの行にはセミコロン(;)しか使えません。終端IDをタブやスペースでインデントしたり、セミコロンの前後に空白を入れるとエラーになります。

開始IDの後に文字列を入れてはいけない

開始IDの後に、コメントを含めて、改行以外の文字列を記述してはいけません。「Parse error: syntax error, unexpected '<<' (T_SL) in~」と、構文エラーが発生します。開始IDの後は必ず改行しましょう。

スペースを入れてもいいのは?

開始IDの後にスペースを入れるとエラーになりますが、次のように開始IDの前であればスペースを入れても問題ありません。
(1)<<<の手前
$data = <<<EOM
(2)<<<の直後
$data = <<< EOM

コメントアウトが使えない

PHPでヒアドキュメントを使う場合、一番困るのがコメントアウトができない点です。

PHPでプログラム開発を行う場合には、その処理が何をしようとしているのかを説明するのにコメントアウト(//や/*~*/)を記述することがよくあります。しかし、ヒアドキュメント内では、コメントアウトした文字列も表示されてしまうので注意が必要です。

ヒアドキュメントは使いどころに気をつけて

ヒアドキュメントのルールや使い方は簡単ですが、その使いどころは難しいものがあります。PHPでは、HTMLのなかにプログラムを埋め込む形式で書くこともできるので、必要に応じて書き方を選択するべきです。

そして、ヒアドキュメントを使う場合には、不具合を生じないような書き方・使い方をするように気をつけてください。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related