プロが教える店舗&オフィスのセキュリティ対策術

PHP初心者です。

初歩的すぎますが¥ってどういう意味ですか?どういう機能、使い方ありますか?

A 回答 (5件)

本題の \に関しての回答は、ほとんどしてませんのでスルーでお願いします。



> header("Content-Disposition: attachment; filename=\"" . $filename . "\"");

これを書いた張本人の俺が説明もなしに、ソースぶん投げっぱなしにしたのが良くなかったみたいで申し訳ないです。

既に 一通り説明されているようですし、俺が口を出すと 余計混乱させてしまう気もするのですが、一応 書いてみます。

> でも。。。どうして¥””と二回も”があるのでしょうか・・・。

最初の\"が、「文字としての"」で、次の"は 「文字列を括る為の"」です。
どちらかというと "\"" で 1セットです。
ダブルクォートで括られたダブルクォートという事です。

ちなみに、更に 混乱させる事を書いちゃっていいでしょうか?
そちらのソースに合わせたので、この書き方なだけで、本当は 俺なら 微妙に別な書き方します。

header("Content-Disposition: attachment; filename=\"" . $filename . "\"");

header('Content-Disposition: attachment; filename="' . $filename . '"');

シングルクォートとダブルクォートが、混在してますので注意してください。

シングルクォートで括る事によって、ダブルクォートをエスケープさせずに使用できます。
シングルクォートもダブルクォートと同じような使い方が出来るものですが、シングルクォートの場合、変数を展開しなかったりしますので、ご注意を。
    • good
    • 0
この回答へのお礼

bm_hiroさんまたのご回答ありがとうございます!

最初が文字としての””次が文字列を括るための”はわかりました。^^

つまり"”test.mp3"" ってやってるんですよね。

filename="test.mp3" では動くけれどfilename=$filenameではもちろん動かない、それでfilename=" .$filename." なぜか動かない・・・。

filename="".$filename."" 基本こんな感じ・・・?(あるいはfilename="'$filename.'" )

エスケープ処理を施してfilename=\"".$filename."\"

・・・なんとなくわかってきました。

filename="" 必ず””が必要。filenameに$filenameを入れるには$filenameに ””を付けることが必要。というわけで二回必要なんですね。

わかりました^^

お礼日時:2011/01/25 17:12

>header("Content-Disposition: attachment; filename=\"" . $filename . "\"")



これも同じような話です。

$filename と言う変数の値をダブルクォート「"」で括りたいのです。

例えば、$filename に「hoge.txt」と言う値が入っていたとしたら、headerの内容を

Content-Disposition: attachment; filename="hoge.txt"

にしたいわけです。

もっと単純な例で書きましょう。

""

例えば、このダブルクォートの間に文字列を入れたいんだけど、入れたい文字列がダブルクォート1文字「"」だったらどうすればよいでしょう?

""" だとエラーになります。

で、答えは、"\"" です。

要するに

「"」は本来は文字列リテラルを括る特殊な記号なんだけど、\を前に付けているから、ただの「"」と言う文字列として扱ってね。エラーにしないでね。

とPHPにお願いしているわけです。

※言語によっては、""" でもOKだったりします。
    • good
    • 0
この回答へのお礼

重ね重ねありがとうございます!
よくわかりました。とっても勉強になりました^^

でも。。。どうして¥””と二回も”があるのでしょうか・・・。

また改めて質問します。

お礼日時:2011/01/24 23:50

 本当はANo.1さんの回答が全てなのだが、理解を助けるために少し補足説明しよう。



 \ (円マークまたはバックスラッシュ)が文字列の中で使われると、文字として表せない文字を表現する事になる。

文字として表せないものの例:
1.改行 (\n)
2.ダブルコーテーション (\")
3.シングルコーテーション (\')
4.円マーク自身 (\\)

1は、たとえばこんな事をしてもだめなわけだ。
$str = "あああいいい
ううう
えええ";
ではどうするかという事で、
$str = "あああいいい\nううう\nえええ";
こうなる。「改行」という概念を円マークと半角小文字のnという2文字で表現できる訳だな。

そうすると2もわかるだろう。文字列を表す記号がダブルコーテーションである以上、
$str = "あああ"いいい";
とするとPHPは「あ」と「い」の間にある「"」が文字列の終わりを意図しているのか、文字列の中にダブルコーテーションを入れたいのかが分からない。なのでこうする。
$str = "あああ\"いいい";
これでPHPは「\"」と「"」によって文字列の終わりかダブルコーテーションを文字列中に入れたいのかが判断できる訳だ。

3番がなぜ必要かというのはもう少し理解を深めてからだろう。いつかステップアップしようとするとき、PHPにおいて文字列とはどう表現するのか(ダブルコーテーションでくくる以外にどう表現できるのか)という事を調べてみていただきたい。

4番ももうばっちりだな。円マークが次に続く文字と合体して何かを表す以上、円マーク自身を意味する別の表現が必要になる。それが円マーク円マークって訳。
$str = "あああ\nいいい";
は、あああ改行いいいを表すが、
$str = "あああ\\nいいい"
は、あああ円マークエヌいいいと解釈される。
    • good
    • 0
この回答へのお礼

ありがとうございます!

理解できました^^

お礼日時:2011/01/24 23:52

いわゆるエスケープ処理です。

どの言語にも多かれ少なかれあります。

http://php.net/manual/ja/language.types.string.php

今回の例示ですと、ダブルコーテーションのくくりのなかにある
ダブルコーテーションを\をつけてエスケープしてます。

たとえば
print "a\"b";
とすれば出力は「a"b」と表示されます。
これをエスケープしないと
print "a"b";
となり、文字列をくくっているのか文字列として表示したいのかわかりません。
(文法的にエラーになります。)
    • good
    • 0
この回答へのお礼

ありがとうございます!

とってもわかりやすかったです^^

お礼日時:2011/01/24 23:51

¥マーク(バックスラッシュ)は、エスケープ文字と言って、特殊な制御文字を文字として識別するためのものです。



例えば、ご質問の元になったのは、こんな例をご覧になったからではありませんか?

// PHP
echo "Hello, World!\n";

\nと書いた場合、これは「改行」を意味するようになります。
上記の例であれば「Hello, World!」と標準出力に表示した後、さらに改行を表示します。

因みに、このバックスラッシュは、C言語でもPerlでもJavaでもPHPでも同じ意味を持ちます。
(元々はC言語から来た概念)

/* C言語 */
printf("Hello, World!\n");

// Java ※
system.out.print("Hello world!\n");

※Javaの場合はprintlnを使う場合が多いので、この書き方はあまりしませんが。
    • good
    • 0
この回答へのお礼

ありがとうございます!

自分がみたやつはちょっと違うみたいなんです???



header("Content-Disposition: attachment; filename=\"" . $filename . "\"")

これなんですが、意味がわかんないのです。

教えてくださいませんか?

お礼日時:2011/01/24 22:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A