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

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

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

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

Q&A

解決済

3回答

6137閲覧

PHPでの二重引用符文字列に関する疑問

maisumakun

総合スコア145121

PHP

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

0グッド

3クリップ

投稿2014/12/03 04:21

PHPで、二重引用符で囲んだ文字列を使うことで、変数代入を行うことができます。

lang

1$foo='hoge'; 2$bar= "foo is $foo ";

これはいいのですが、連想配列の場合には、

lang

1$foo=array('hoge'=>'piyo'); 2$bar="foo[hoge]=$foo[hoge]"; //正 3//$bar="foo[hoge]=$foo['hoge']"; //誤

のように、連想配列のキーとして入れる文字列を引用符で囲ってはならないことになっています。

どうしてこのような実装になっているのか、背景事情(プログラム上の事情、歴史的背景など)などをご存じの方はお教えいただければ幸いです。

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

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

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

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

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

guest

回答3

0

ご存知の通り"(ダブルクォーテーション)'(シングルクォーテーション)で囲んだものはPHPではstring(文字列型)として解釈します。
PHPはこのように自動でデータ型判別しています。

それを踏まえて手順を踏んで解説していきます。

基本的な$foo['hoge']の解釈

  1. $がついてるのでfooという変数名である
  2. []で囲われているのでキーを指定してあるのだとわかる
  3. その時'(シングルクォーテーション)囲われているのでhogeという名前のキーだと認識。

もし$foo[hoge]だったら

  1. $がついてるのでfooという変数名である
  2. []で囲われているのでキーを指定してあるのだとわかる
  3. その時'(シングルクォーテーション)囲われていないのでhogeという定数に定義された何かだと認識

これが基本の解釈なのですが、今回のように全体を"(ダブルクォーテーション)で囲んだ場合はすでに文字列として解釈しているので、定数である可能性はなくなります
そのため定数と文字列を識別する必要がないので'(シングルクォーテーション)で囲う必要がなくなります。
逆に'(シングルクォーテーション)も文字列として判別されるので、
もし囲ってしまうと'(シングルクォーテーション)を含んだ文字列として認識されるので、結果として存在しないキーを参照してエラーになるのです。

また、このように"(ダブルクォーテーション)によって文字列として判別されないように部分的に{}波括弧を使うことで通常の表記が可能となります。

例:$bar="foo[hoge]={$foo['hoge']}";

動的型付けであるPHPの癖が顕著に現れる部分ですね。
簡単に説明してしまったので理解できない部分があれば補足します。

投稿2014/12/03 05:20

SAMURAI-HACK

総合スコア988

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

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

0

ベストアンサー

既にある回答には正しいことが記述されているのですが、質問者さんが疑問に思われているのはそういうことではなく、

二重引用符リテラルにて、どうして { } で括った場合とそうでない場合で解釈に差が設けられているのか?

ということですよね?…おそらく直球な答えはPHPの創始者であるラスマス氏に直接質問でもしないと答えは得られないでしょう。PHP3やPHP/FIの文献を漁ってみましたが、私が探した限りでは歴史的背景に関する記述は見つかりませんでした。

StackOverflowにも似たような質問がありました。

Interpolation (double quoted string) of Associative Arrays in PHP

[ベストアンサー]
If you want to have a reason why this was done so, well, I can't help you there. But as always: PHP is old and has evolved a lot, thus introducing inconsistent syntax.

[(英語素人の)意訳]
もし理由を探そうというものなら、私は力にはなれません。例によってPHPは、黎明期には一貫性のない構文をもっていましたが、それらを改善することで進化を遂げてきたものなんです。(つまり最初から深く考えて設計されてないから理由なんて考えるのも無意味だということ)

PHPがクソ言語だと言われる所以でもありますねw
三項演算子が左結合なのは有名な設計ミスの1つです…

投稿2014/12/03 05:54

mpyw

総合スコア5223

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

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

TaMaMhyu

2014/12/03 06:02

$、{$} 以外にも、${} の書き方もありますね。
mpyw

2014/12/03 06:07

そうですね、私は前者の2つに比べるとあんまり使いませんがw (確かパース速度は ${} が最速だった気がする)
TaMaMhyu

2014/12/03 06:10

三項演算子はC言語の感覚で括弧付けないで書いてしまうとはめられますね。
maisumakun

2014/12/03 06:12

PHPはもともと「スクリプト言語を作るつもりなどなかった」ところから進化してきたものですし、一貫性のなさは現代に至っても「お家芸」と化している感がありますね。
TaMaMhyu

2014/12/03 06:15

{$}は外で結合するのと同じ感じで、$と${}はそれぞれ微妙に違うという…
mpyw

2014/12/03 06:25

実際に検証してみたら全然速度違いました… http://ideone.com/WaBI7l http://ideone.com/9wss9m http://ideone.com/ZZGpjI http://ideone.com/mYGEk4 http://ideone.com/jpKDYu http://ideone.com/R5oTsF $val << {$val} < ${val} $arr[key] << ${arr['key']} < {$arr['key']} という順位になりました。 {$} と ${} の差は誤差のレベルかもしれませんが、$ が一番速いのは意外でした!ただevalを使わない場合はどうなるかは分かりません。
guest

0

質問の趣旨からはずれますが、全体を{}でくくれば''を付けても展開されると思います。

投稿2014/12/03 05:19

TaMaMhyu

総合スコア1356

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

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

mpyw

2014/12/03 05:21

むしろその場合は付けないとhogeが定数扱いになっちゃうのでNGですね
c610424

2014/12/03 05:28

定数にもならないよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問