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

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

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

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

Q&A

解決済

5回答

2575閲覧

PHP <option value='{変数}'> ←のシングルクォーテーションにする意味がわかりません

Koyo12

総合スコア3

PHP

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

0グッド

1クリップ

投稿2021/04/15 15:45

編集2021/04/15 15:51

PHP初学者です。現在プロゲートでPHPを学習中です。
イメージ説明
こちらの47行目のforeach文のvalueに変数を入れるとき、変数展開で
{$変数名}
となるのは理解しているのですが、
プロゲートの解答の47行目の value= '{$type}'←こちらのようにvalue = '{$変数名}'となっており、シングルクォーテーションがつく理由がわからないので教えて欲しいです。
valueのような(プロパティ?と呼ばれているのかな)には変数を入れないとき
value="toy" のようにダブルクォーテーションがつく構文と学習していました。
なので自分的にはなんでダブルクォーテーションじゃだめなんだろうと頭を抱えています。
変数を展開するときはまた別の書き方なんですかね?
ちなみに47行目をシングルクォーテーション→ダブルクォーテーションにするとエラーが起きて
シングルクォーテーションを取り除いてもエラーは起きませんでした。
駄文で申し訳ないです。わかりにくかったらすいません。

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

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

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

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

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

miyabi_takatsuk

2021/04/15 15:56

"にしてみて、実行してみましたか? エラーが起こるはずです。
guest

回答5

0

直接の回答としては、 ' の部分を " にするとその部分で文字列が途切れてしまうからです。

順を追って考えてみると分かりやすいかもしれません。まず、最終的に出力したいものは次のようなHTMLですよね。

html

1<option value="タイプの値">タイプの値</option>

これをそのまま " で囲んでPHPで出力しようとするとこうなりますが、

php

1echo "<option value="{$type}">{$type}</option>";

これだと文字列が { の直前で切れてしまうのでPHPとしては間違った構文になってしまいます。(エラーになると思います)

では文字列全体を " ではなく ' で囲むとこんな風になり、

php

1echo '<option value="{$type}">{$type}</option>';

これだと途中の " の部分で文字列が途切れることはなくなるため動くようになります。しかし、PHPは ' だと文字列内の変数が展開されないため、

html

1<option value="{$type}">{$type}</option>

こんな感じのHTMLが出力されてしまうかと思います。

そんなわけで、記載されているプログラム例では「外側を " で囲む」「内側を ' で囲む」として、意図せず文字列が途切れてしまうことを回避しつつ、変数も展開されるようにしているのだと思います。

php

1echo "<option value='{$type}'>{$type}</option>";

html

1<option value='タイプの値'>タイプの値</option>

余談ですが、上記のコードでも問題なく動作すると思いますが、HTMLの慣習的にはタグの属性は " で囲む方が一般的です。ですので、綺麗に書くならば本当は「外側を " で囲みつつ」「内側も " で囲む」とやりたいわけです。そうするためには、ここでは詳細には言及しませんが、 エスケープ を使うと実現ができます。

php

1echo "<option value=\"{$type}\">{$type}</option>";

投稿2021/04/15 16:19

編集2021/04/16 07:14
kitar

総合スコア23

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

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

0

初学者向けの学習教材は、php の公式ドキュメントが読めるようになるまでのつなぎです。基礎が一定レベルまで達したのであれば、公式を頼ると良いですよ。

引用符/変数展開に関連する単語が一定レベルの理解に達すると公式の以下が参考になります。
文字列 - php.net

php の公式は大変よくできているので、初学者向け教材で、ある程度の体系的学習が完了したら公式を確認するようにしましょう。

投稿2021/04/15 21:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

別にシングルクォートでもダブルクォートでもどっちでも良いです。

ただし、ダブルクォートの中なので、ダブルクォートを書く時は\"と書く必要があるので、それを嫌ってシングルクォートにしたのでしょう。

投稿2021/04/15 16:05

otn

総合スコア84533

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

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

0

ベストアンサー

ちなみに47行目をシングルクォーテーション→ダブルクォーテーションにするとエラーが起きて

シングルクォーテーションを取り除いてもエラーは起きませんでした。

起きている現象が全てです。
HTMLの観点からすると、タグにつける属性(今回はvalue)の属性値について、囲うクォーテーションはダブル、シングルどちらでもよく、もっと言えば、クォーテーションなくても正常に動作します。
ただし、半角スペースを属性=属性値を区切りとするため、属性値に半角スペースを含みたい場合はクォーテーションは必須です。

たまに区切りたいのに全角スペース入れてしまったりクォーテーションの閉じ忘れでタグの属性が正しく認識されないということが起きて質問される方がいます。
なので「属性値は同じクォーテーションで囲う」「属性間の区切りは半角スペース」を徹底することでHTMLのミスをなくすようにできます。

次はPHPの観点。
PHPにおいて文字列を扱う際にクォーテーションは特別な意味を持ちます。
シングル、ダブルどちらも使えますが、変数の展開や¥nなどの扱いで違いが出ます。
いずれもクォーテーションは「文字列としての開始と終了」を表すものです。HTMLタグでは「属性値の開始と終了」を表しますが、役割としては同じ。

どちらも開始同じクォーテーションが出てくるとそこで終了の区切りと見なされますから、前述の「役割としては同じ」特性を利用し、同じクォーテーションを避けることで文字列の出力を間違いなく行う配慮がなされてると言って良いです。


という配慮が面倒な人、HTMLには全部ダブルクォーテーションが使いたいんだ、ということなら、変数出力だけをPHPタグに任せたり、ヒアドキュメントを使うと良いです。
テンプレートエンジン導入が「ロジックとビューの切り分け」という観点だとベターとは思いますが。

投稿2021/04/16 00:25

編集2021/04/16 00:30
m.ts10806

総合スコア80850

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

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

0

PHPのecho構文にて、
外側で、"を使用しているので、中の属性の引用符を'にしないと、
全体を文字列とすることができないからです。
echo "<option value="{hoge}">";
では、途中の"でPHP上の文字列は途切れ、構文エラーとなってしまいます。
なので、それを防ぐために、
"で両端を囲っているなら、その中は、'を使用します。

また、
HTML構文においては、属性の引用符を"にしなければいけない、という仕様はありません。
'も使用することができます。

"'の違いに関して

両者にほとんど違いはありません。
両方、プログラム上囲った文字を文字列として扱う、引用符として機能します。
ですが、その文字列の中でさらに引用符を使用したいという時は、
(今回のように、PHP構文内文字列にて、HTMLによる引用符を付けたい時、など)
外側で使用している方とは、違う方を使用します。

php

1echo "This's pen"; 2echo "<img src='hoge.png'>"; // 外側が"なので、中は、'を使用しないと、そこで文字列は途切れ、構文エラーとなる

のようにです。

余談ですが、基本的には"'は仕様は一緒なのですが、
使う言語や場面によっては、若干仕様が異なる場合があります。

そして、
エスケープを使うことで、外側の引用符と同じ引用符を使用することができます。
echo "<option value=\"{hoge}\">";
のようにです。\の後ろの文字は、メタ文字も、文字列として扱われます。

投稿2021/04/15 16:09

編集2021/04/15 16:13
miyabi_takatsuk

総合スコア9528

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問