プルダウン形式の選択肢を表示表示させる時、上記の①では動作して、②では動作しない理由がわかりません。
①
$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)では動作して、(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()は実際には関数ではありません (言語構造です)。
このため、引数を括弧で括る必要はありません。
<? $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("\\") ;
お返事遅くなってすみませんでした!ありがとうございました!
シングルクォートで括った場合には変数展開されない
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>');
お返事遅くなってすみませんでした!ありがとうございました!
>(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()は実際には関数ではありません (言語構造です)。
このため、引数を括弧で括る必要はありません。
お返事遅くなってすみませんでした!ありがとうございました!
echo()も括弧いらないのですね。ありがとうございます!
http://jp.php.net/manual/ja/function.echo.php
お返事遅くなってすみませんでした!ありがとうございました!
2012/01/10 09:44:16echo()も括弧いらないのですね。ありがとうございます!
2012/01/10 09:47:31http://jp.php.net/manual/ja/function.echo.php