phpの基本的な質問です。お時間あるかたいたらおしえてください!


プルダウン形式の選択肢を表示表示させる時、上記の①では動作して、②では動作しない理由がわかりません。


$i = 10;
print('<option value="' . $i . '"> '. $i .'</option>');


$i = 10;
print('<option value = "$i" > $i </option>');

②でも、$iを代入するだけなのだから正常に動作してもおかしくないと思うのですが、なぜ、①のように.で表示させる必要があるのでしょうか。

もう一つ、print('<option value="' . $i . '"> '. $i .'</option>'); のクォーテーションの使い方ですが、print("<option value="' . $i . '"> '. $i .'</option>");のように両端がダブルクオーテーションになったら正常に動作しません。恐らく、はじめが "<option value="になっているからでしょうけど、正解の方の式も、後半に'</option>'となっている箇所があります。これはつまり、プログラムは文章を左から呼んでいっているから、左から読んだ時に、クォーテーションの使い方が重複しているNG,という理解でよいでしょうか。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/01/10 09:47:40

ベストアンサー

id:windofjuly No.3

回答回数2625ベストアンサー獲得回数1149

>(1)では動作して、(2)では動作しない理由がわかりません
ダブルクォートで囲んだ場合は、内部の変数を展開する
シングルクォートで囲んだ場合は、変数の展開を行わない
だから、それぞれの出力結果は下記のようになる

(1)
print '<option value="' . $i . '"> '. $i .'</option>';
    ↓↓↓
<option value="10">10</option>

(2)
print '<option value = "$i" > $i </option>';
    ↓↓↓
<option value="$1"> $1 </option>

>両端がダブルクオーテーションになったら正常に動作しません
”を単なる文字として認識するようにエスケープします
具体的には半角の¥を”の前にそれぞれつけることです

(3)
print "<option value=\"$i\">$i</option>";
    ↓↓↓
<option value="10">10</option>

(1)と(3)のどちらを利用してもかまいませんが、
エスケープを忘れるといった凡ミスをおかしやすく、
メンテナンスも面倒なので、推奨は(1)です

余談ですが、
printに(かっこ)は不要ですし、
将来への互換性を考慮するなら付けるべきではないです
http://php.net/manual/ja/function.print.php

print()は実際には関数ではありません (言語構造です)。
このため、引数を括弧で括る必要はありません。

他1件のコメントを見る
id:keiji_kc

お返事遅くなってすみませんでした!ありがとうございました!

2012/01/10 09:44:16
id:keiji_kc

echo()も括弧いらないのですね。ありがとうございます!
http://jp.php.net/manual/ja/function.echo.php

2012/01/10 09:47:31

その他の回答2件)

id:HowAreYou No.1

回答回数91ベストアンサー獲得回数17

<?
$i = 10 ;
print('<option value = "$i" > $i </option>') ;

まず、両端をシングルクォートではさむと変数は展開されません。
そこで

<?
$i = 10 ;
print("<option value = "$i" > $i </option>") ;

のようにするとエラーになります。
"<option value = " で文字列が一旦途切れてしまい、次にいきなり「$」があらわれるためで、文法違反になります。
解決のための第一の方法が、1番のように

$i = 10 ;
print("<option value = ".$i." >". $i." </option>") ;

ピリオドでつなぐ方法。ピリオドは文字列と文字列をつなぐ役割をし、$i は "10" という文字列に変換されてつながれます。
第二の方法は

$i = 10 ;
print("<option value = \"$i\" >$i</option>") ;

ダブルクォートの前に「\」を付ける (エスケープする) 方法。
「\」を付けることでダブルクォートは文字列をはさむ記号ではないと解釈されます。
ついでにいうと、

print("\") ;

はエラーになります。
正しくはこうなります。

print("\\") ;
id:keiji_kc

お返事遅くなってすみませんでした!ありがとうございました!

2012/01/10 09:44:01
id:Cherenkov No.2

回答回数1504ベストアンサー獲得回数493

シングルクォートで括った場合には変数展開されない
PHPスクリプト講座:文字列内での変数展開 -- そふぃのphp入門


<?php
$i = 10;
print('<option value="' . $i . '"> '. $i .'</option>');
print("<option value=\"$i\">$i</option>");

$fish = array('10'=>'kingyo');
print("<option value=\"{$fish["10"]}\">{$fish["10"]}</option>");
print('<option value="{$fish["10"]}">{$fish["10"]}</option>');
id:keiji_kc

お返事遅くなってすみませんでした!ありがとうございました!

2012/01/10 09:44:05
id:windofjuly No.3

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

>(1)では動作して、(2)では動作しない理由がわかりません
ダブルクォートで囲んだ場合は、内部の変数を展開する
シングルクォートで囲んだ場合は、変数の展開を行わない
だから、それぞれの出力結果は下記のようになる

(1)
print '<option value="' . $i . '"> '. $i .'</option>';
    ↓↓↓
<option value="10">10</option>

(2)
print '<option value = "$i" > $i </option>';
    ↓↓↓
<option value="$1"> $1 </option>

>両端がダブルクオーテーションになったら正常に動作しません
”を単なる文字として認識するようにエスケープします
具体的には半角の¥を”の前にそれぞれつけることです

(3)
print "<option value=\"$i\">$i</option>";
    ↓↓↓
<option value="10">10</option>

(1)と(3)のどちらを利用してもかまいませんが、
エスケープを忘れるといった凡ミスをおかしやすく、
メンテナンスも面倒なので、推奨は(1)です

余談ですが、
printに(かっこ)は不要ですし、
将来への互換性を考慮するなら付けるべきではないです
http://php.net/manual/ja/function.print.php

print()は実際には関数ではありません (言語構造です)。
このため、引数を括弧で括る必要はありません。

他1件のコメントを見る
id:keiji_kc

お返事遅くなってすみませんでした!ありがとうございました!

2012/01/10 09:44:16
id:keiji_kc

echo()も括弧いらないのですね。ありがとうございます!
http://jp.php.net/manual/ja/function.echo.php

2012/01/10 09:47:31

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません