連想配列を含むヒアドキュメントの書き方

このQ&Aのポイント
  • 連想配列を含むヒアドキュメントの書き方について教えてください。新たな変数を使用せずにコードを実行したい場合、エラーが発生してしまいます。
  • PHPでは、(2)のようなヒアドキュメント内で直接連想配列を参照することはできません。エスケープや引用符の変更などの対応策もうまくいきません。
  • 一方、(1)のように一時的な変数を使用して連想配列を含むヒアドキュメントを作成する方法は有効です。エラーのリスクを回避しながらコードを実行することができます。
回答を見る
  • ベストアンサー

連想配列を含むヒアドキュメントの書き方

連想配列を含むヒアドキュメントの書き方を教えてください。 以下のコードならうまく行きました。 -(1)-------------------------- $SS = $_SERVER['PHP_SELF']; $html_txt = <<<EOT ($SS) EOT; echo $html_txt; ------------------------------ これを一時的な変数を使わずに以下のようなコードで実行したいです。 -(2)-------------------------- $html_txt = <<<EOT ($_SERVER['PHP_SELF']) EOT; echo $html_txt; ------------------------------ これを実行すると # Parse error: syntax error, unexpected '"', # expecting T_STRING or T_VARIABLE or T_NUM_STRING in … というエラーが出てしまいます。 最悪、(1)でもいいと思っています。しかし(2)のようなケースでもできてもいいのではないかと思うのですが、エスケープを入れたり「$_SERVER["PHP_SELF"]」などとクォーテーションを変更したりしてもうまく行きません。 質問は以下です ・(2)のような記述はPHPでは不可能なのでしょうか? ・もし可能なら(1)の何が悪いのか、どうすればうまく行くのかを教えてください よろしくお願いします。

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.3

もしくは <?PHP $html_txt = <<<EOT ($_SERVER[PHP_SELF]) EOT; echo $html_txt; 備考: http://qiita.com/mpyw/items/8dd5378cb01c877e1f7b

pringlez
質問者

お礼

おお。これでもいいんですね。 最初見たときは、「それじゃダメなんじゃないの?」と思ったのですが、試してみたらうまくいきました。 もしかしたらこれを見て戸惑う人もいるかもしれないので、あまり使用しないほうがいいのかもしれませんけど。 ありがとうございました

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

PHPはマニュアルがよくできているので、マニュアルを読む習慣を付けるといいです。 http://www.php.net/manual/ja/language.types.string.php#language.types.string.parsing ここに、 // 動作します。クォートしたキーを使う場合は、波括弧構文を使わなければなりません と書いてあります。

pringlez
質問者

お礼

>PHPはマニュアルがよくできているので、 >マニュアルを読む習慣を付けるといいです。 …。はい。まさにおっしゃるとおりです。 しかも私はそのページを見た上で質問をしました。 私が見たのはそのページの以下の4項目で ・引用符 ・二重引用符 ・ヒアドキュメント構文 ・nowdoc 構文 それより下はサンプルコードが無駄に多いなと思いざっとしかみませんでした。 もう少し下も読めばよかったのですね…。 残念でした…。 ありがとうございました

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

こうじゃない? <?PHP $html_txt = <<<EOT ({$_SERVER['PHP_SELF']}) EOT; echo $html_txt;

pringlez
質問者

お礼

は、あれ?なに? 確かにそのとおりです…。それでうまく行きました。 変なところでつまづいていました。 ありがとうございました

pringlez
質問者

補足

この3パターンはうまくいって (a) ({$_SERVER['PHP_SELF']}) (b) ({$SS}) (c) ($SS) これだけうまくいきませんでした。 (d) ($_SERVER['PHP_SELF']) 逆に何で(c)はいいの? (c)はいいのになぜ(d)はダメなの? という疑問が発生しました。 「{}」なしは省略形で、クォーテーションの無い単純な変数だけ省略できるという感じですかね。(自分で書いてて、この理由な気がしてきましたが…) もしよろしければこの点についても教えてください。 よろしくお願いします。

関連するQ&A

  • ヒアドキュメントの制約?

    PHP5を使っています。 ヒアドキュメントで以下のように書きましたが1ではエラーになり2ではエラーになりません。 配列の添え字の前後にスペースを付けて、ソースを見やすくしていたのですが、ヒアドキュメントでは、これはエラーになるのでしょうか? 理由が知りたいです。 $ary_dat = array("あ", "い", "う"); (1) echo <<<END_OF_DAY $ary_dat[ 0] END_OF_DAY; (2) echo <<<END_OF_DAY $ary_dat[0] END_OF_DAY;

    • ベストアンサー
    • PHP
  • 連想配列の操作がうまくいかない

    チェックがついてきたものは"or"ついていなかったものは"and"を返すphpを作成しています。 if($_POST["cb"]) { //チェックされていれば $cb = $_POST["cb"]; //変数 $cb に格納 } $ands = array_fill(0,8,"or"): foreach($ands as $and){ //・・・・・・・・・・・・・・(A) if($cb){ $and="or"; } } echo <<< EOT <form method="POST" action="./checkbox.php"> <input type="checkbox" name="cb[0]">title0<br> : <input type="checkbox" name="cb[8]">title8<br> <input type="submit" value="送信"> </form> EOT; たとえば0,1,4,6にチェックがついていたら、 $and=("or","or","and","or","and","or","and","and") 1.7にチェックがついていたら $and=("or","and","or","or","or","or","and","or) となるように考えたのですが、なぜか(A)の部分にシンタックスエラーが出てきます。 どなたか解決方法をご教示ください。どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • ヒアドキュメントの中で別ファイルをインクルード

    PHPでヒアドキュメントの中で別ファイルをインクルードする方法はどのように処理するのでしょうか? sample.txt <p>サンプルテキストからの文字</p> ------------------------------------ sample.php $sample = <<<_EOM_ <html> <head> </head> <body> サンプルサンプル<br> *ここにsample.txt内のhtmlソースをインクルードしたい。 </body> </html> _EOM_; 以下省略(echoとかで出力)

    • 締切済み
    • PHP
  • ヒアドキュメントについて

    以前質問しましたが、解決できませんでした。 ヒアドキュメント内での多次元配列の扱いで悩んでいます。 ソースは <?php require_once("mysql.php");// MySQLへのID・パスワードの取得をするファイルへのアクセス function kensaku($str1,$str2,$str3,$str4){ $mysql = new MySQL; $sql = "SELECT * FROM tankanji WHERE kanji like '%$str1%' AND (onyomi like '%$str2%' OR kunyomi like '%$str2%') AND kakusuu like '%$str3%' AND busyu like '%$str4%'"; $row=$mysql->query($sql); echo <<<EOM <TABLE width="3000" frame="border" border="3" cellspacing="1" cellpadding="3"> <TBODY> <TR><TH>id</TH><TH>漢字</TH><TH>音読み</TH><TH>訓読み</TH> <TH>画数</TH><TH>部首</TH></TR> while ($row = $mysql->fetch()){ <TR> <TD align="center"><?={$row['id']}?></TD> <TD align="center"><?={$row['kanji']}?></TD> <TD align="center"><?={$row['onyomi']}?></TD> <TD align="center"><?={$row['kunyomi']}?></TD> <TD align="center"><?={$row['kakusuu']}?></TD> <TD align="center"><?={$row['busyu']}?></TD></TR> } </TBODY> </TABLE> EOM; } なんですが、うまくいきません。 $row=$mysql->query($sql); のあとでprint文で$rowの中身を表示させたらきちんと入っているのでecho <<<EOM以降がおかしいものと思います。 エラーの内容としてはsyntax error, unexpected '"', expecting T_STRING or T_VARIABLE or T_NUM_STRINGと表示されてしまいます。これがどうしてもやらないといけないことでしてものすごく困っています。。初心者の質問で大変申し訳ないです。

    • ベストアンサー
    • PHP
  • phpのエラー(T_LNUMBER)について

    Parse error: syntax error, unexpected T_LNUMBER, expecting ',' or ';' in /..../..../result.php on line 202 というエラーが出ます。 このエラーはresult.phpファイルの202行目に「,」もしくは「;」が足りないよという意味を示していると思うのですが、どう足りないのかというところでひっかかっています。 改行してみたりして行数を確認してみると、特定のコードの箇所に対するエラーでした。 以下が該当する202行目のコードです。 if ($p > 1) { echo "<font size=¥"1¥"><a href=¥"$_SERVER[PHP_SELF]?p=$prev1¥"><</a></font>"; } 上記コードのecho "~~~~~の行が202行目です。 これはどこが間違っているのでしょうか? もしくはそもそも違う部分で間違っている可能性があるということなのでしょうか。。。 アドバイスをいただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 連想配列の可変変数

    <?php $test[a][b][c] = "成功"; $string = 'test[a][b][c]'; echo ${$string}; ?> このコードで"成功"を出したいのですが上手くいきません 恐らく可変変数ではブラケットを文字列として扱ってしまっているのが原因だと思います どうにかうまくこれを可変変数のように上手く実現させる方法はないでしょうか?

    • ベストアンサー
    • PHP
  • PHPでFopenモードを「a」で開きたいのですが、

    PHPでFopenモードを「a」で開きたいのですが、 パーミッションを「777」でしか受け付けてくれません。 コードは、 $fp = @fopen("test.txt","a") or die("Error"); echo "ok"; fclose($fp); です。 サーバーはxreaでPHPのバージョンは5です。

    • 締切済み
    • PHP
  • switchでエラー

    Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in C:\path\file.php on line 11 この行を見る限りどこも悪くは無い気がしますが・・・ (ヒアドキュメント) 10:HEADER_HTML; 11:switch ($_GET['mode']){ 12: case 'edit': どこが悪いのでしょうか。

    • ベストアンサー
    • PHP
  • 文法エラーが解決出来ません・・

    phpでパースエラーが出るのですが、ドコが間違っているのかが解りません。 ============エラー文========================================= Parse error: syntax error, unexpected T_CHARACTER, expecting T_STRING or T_VARIABLE or T_NUM_STRING on line 296 ============================================================= ============エラーのソース(左の数字が行番号)================= 295|$str = " 296|//<form method=\"post\" action=\"$SERVER[\"PHP_SELF\"]\" enctype=\"multipart/form-data\" > ・ ・ 472|</html>"; 473|$str = mb_convert_encoding($str, "SJIS", "EUC-JP"); 474|echo $str; ============================================================= 295行目の$strに296行目から472行目までのHTML記述を代入して最後の行で出力しようとしているものです。 ちなみに、296行目のエスケープ(//)は、エスケープしてもしなくても296行目にエラーが出ます。 どなたか心当たりありましたらご意見宜しくお願いします!

    • ベストアンサー
    • PHP
  • PHPでのQUERY_STRINGの使い方

    PHPを勉強中です。 URLの?以降の文字列を取得し、それが正規表現で 数字と()、/*+-の数式に一致するかどうかを割り出したいです。 echo preg_match("/[^0-9\(\)\+\*\/-]/", "$_SERVER['QUERY_STRING']"); としたところ、 Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) とエラーが出てしまいます。記述の仕方が悪いのでしょうか。 ご教示お願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう