人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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,という理解でよいでしょうか。

●質問者: keiji_kc
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● HowAreYou
<?
$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("\\") ;

keiji_kcさんのコメント
お返事遅くなってすみませんでした!ありがとうございました!

2 ● Cherenkov

シングルクォートで括った場合には変数展開されない
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>');

keiji_kcさんのコメント
お返事遅くなってすみませんでした!ありがとうございました!

3 ● うぃんど
ベストアンサー

>(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()は実際には関数ではありません (言語構造です)。
このため、引数を括弧で括る必要はありません。


うぃんどさんのコメント
回答2つもついてた・・・orz

keiji_kcさんのコメント
お返事遅くなってすみませんでした!ありがとうございました!

keiji_kcさんのコメント
echo()も括弧いらないのですね。ありがとうございます! http://jp.php.net/manual/ja/function.echo.php
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ