質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

1755閲覧

ヒアドキュメントないの変数の取り扱い

SugiuraY

総合スコア317

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/09/13 22:51

下記のようにヒアドキュメントないでPOSTの値を受け取る場合ですが、
//errorのように直接これを受け取る場合、以下のようにphp上errorとされます。
もちろん波括弧でくくるという方法もあるのですが、マニュアル
を読んでもどのような理由で生じるエラーなのかがわかりません。。

'parse error, expecting "identifier(T_STRING)" or "variable(T_VARIABLE)" or "number(T_NUM_STRING)"'

なんとなくなのですが中括弧[]がparse errorの対象となっているように思えるのですが、
ヒアドキュメント上は特別な意味がありエスケープされるべき文字列等なのでしょうか?

もしご存知の方がいれば教えてください。
よろしくお願い申し上げます。

PHP

1//works! 2<?php 3$hoge=$_POST['piyo']; 4$bar=<<<EOM 5<p>$hoge</p> 6EOM; 7?> 8 9<?php 10//error 11$bar=<<<EOM 12<p>$_POST['piyo']</p> 13EOM; 14?> 15 16<?php 17//works 18$bar=<<<EOM 19<p>{$_POST['piyo']}</p> 20EOM; 21?> 22

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こちらこちらはご覧になりましたでしょうか?
ヒアドキュメントは二重引用符で囲っていることと同義となりますが、二重引用符内での連想配列の添字にはクォーテーションを使うことが出来ません。

php

1$bar=<<<EOM 2<p>$_POST[piyo]</p> 3EOM;

であれば動作すると思います。

とはいえ連想配列以外を使う可能性も考えれば、前後にスペースを入れないといけないことなどを考えると、最初から波括弧で囲うほうに統一したほうが良いようにも思えます。

投稿2018/09/13 23:29

Takumiboo

総合スコア2534

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2018/09/14 00:08

Takumiboo様 コメント有難うございます。 マニュアルを拝見させて頂きました、確かに二重引用符の中で連想配列の添字に引用符を打つことはできないのですね。 普段、文字列を扱う場合、エスケープシーケンスを使うのが見た目上嫌いだったため $hoge="今日の天気は'晴れ'のようです"; のようにシングルとダブルを使い分けていたのですが、本ケースでは、同じように取り扱うことはできないのですね。 今後、は波括弧で統一して処理したいと思います。 誠に有難うございました。
退会済みユーザー

退会済みユーザー

2018/09/14 01:40

変数周りで「{」「}」を使って明瞭化するべきです。
SugiuraY

2018/09/14 01:42

コメント有難うございます。 提示の以下のコードで明瞭化するとの認識なのですが、相違ございますでしょうか? <p>{$_POST['piyo']}</p> 念のためにご確認させてください。
退会済みユーザー

退会済みユーザー

2018/09/14 02:18 編集

他人のリアクションを待つ数分~数十分を待つよりも、簡単なサンプルコードを書いて検証すれば、確実にあなたの血となり肉となりますよ。→書いた: http://m6u.hatenablog.com/entry/2018/09/14/111609
SugiuraY

2018/09/14 02:52

m6u様 コメント有難うございます。コードの適切性という観点ではなく、 “変数周りで「{」「}」を使って明瞭化するべきです。”=”あなたの提示のコードでは「{」「}」で明瞭化されていません”という解釈かを確認したかったということでございます。 いずれにしても、自分自身でも改めて各パターンの動作をチェックしてみようと思います。 改めて御礼申し上げます。
guest

0

そのエラー例ですとダブルクォーテーションも同じエラーとなります。

php

1$bar="<p>$_POST['piyo']</p>";

[]がどうというより、連想配列を文字列の中に含む際のルールと思ったら良いかなと。
単体の変数と違い「ここからここまでがPHPの変数である」と明示するために{}で囲います。
例えば英数字の途中で変数を入れる場合、文章の途中で入れる場合はどこからどこまでが変数かわからなくなりますし(特に英数字の場合は正しく変数を解釈できません)、
単体の変数であっても明示するために{}で囲う習慣をもっておいたほうがトラブルが減ると思います。

投稿2018/09/13 23:29

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Takumiboo

2018/09/13 23:40

波括弧で囲っていないことが直接のエラーの原因ではありません。ワタシの回答に記載したURL内の「注意: 二重引用符で括られた文字列の中では 引用符で配列の添字を括らないことができ、このため、 "$foo[bar]" は有効です。」や「同様に、配列添字とオブジェクトのプロパティをパースすることも可能です。 配列添字の場合、閉じ角括弧 (]) は添字の終りを意味します。 シンプルな変数の場合と同じ規則が、オブジェクトのプロパティに対しても適用されます。」が理由です。
m.ts10806

2018/09/13 23:59

波かっこで囲っていないことが直接の原因であると書いたつもりはないのですが、そのように伝わったのであれば申し訳ないです。 補足ありがとうございます。
m.ts10806

2018/09/14 00:00

結局のところ、私の回答で伝えたいことはTakumibooさんの回答の最後とおなじなので。
SugiuraY

2018/09/14 00:10

mts10806様 コメント有難うございます。 いずれのコメントにつきましても、問題点を理解することができました。 お力添えを頂きましたことを深謝申し上げます。
m.ts10806

2018/09/14 00:12

解決されたようで何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問