シングルクォーテーションとダブルクォーテーションについて
PHPのシングルクォーテーションとダブルクォーテーションの違いについて、復習も兼ねて書いていきたいと思います。。
結論
・シグルクォーテーションでかこった場合は、 変数と特殊文字のエスケープシーケンス(\tや\tなど)は文字列になる
・ダブルクォーテーションでかこった場合は、変数は変数と認識され、エスケープシーケンスは展開される(反映される)
今回はこの違いに大分悩まされました。
しかし優しい先輩方などのおかげで無事解決!
勉強になりました。
さてその悩んだところですが、
1行掲示板を作るという処理の、ファイルに書き込む処理で、
//かきこみの
function write($comments) {
$number = count($comments) + 1;
$fp = fopen("bbs.txt",'a');
$comment = sprintf("%s\t%s\t%s\t%s\n",$number,$_POST['name'],$_POST['comment'],time());
fprintf($fp,'%s',$comment);
fclose($fp);
$comments[] = explode('\t',$comment);
return $comments;
}
こんな書き方をしたら$comments[1]や[2]を参照するときにエラーがでました。
なんだろうと思ったら、どうやら
$comments[] = explode('\t',$comment);
ここの部分でちゃんと「\t」(タブ)で区切られていないみたいでした。
「\t」が認識されていないのかな?と思った私は、
$comment = sprintf("%s\t%s\t%s\t%s\n",$number,$_POST['name'],$_POST['comment'],time());
↑の部分を、
$comment = sprintf('%s\t%s\t%s\t%s\n',$number,$_POST['name'],$_POST['comment'],time());
↑の様にシングルクォートでかこってみました。
しかしちゃんと区切られるようになりましたが、今度はファイルの中で「\n」(改行)が反映されなくなり、
読み込みのときの
$lines = file($filename);
この部分で、
$lines[0]に全部のデータが入ってしまうという事態になってしまいました。
調べてみると、それぞれのファイルの中身は、
*ダブルクォートの場合
1 aaaaaa bbbbbb 1215158278
2 cccccc dddddd 1215158322
*シングルクォートの場合
1\taaaaa\tbbbbb\t1215160968\n2\tccccc\tddddd\t1215160972\n
このように入っていました。
一見、シングルクォートの方は「\n」あるじゃんと思うのですが、これは文字列として表記されてしまっています。
なので、ファイルの中での改行区切りのfile関数だと全て1行だと思われてしまったみたです。
そしてダブルクォートの方ですが、改行もされているし、タブ文字もあるので、これはこれでOKでした。
しかし、
$comments[] = explode('\t',$comment);
こっちでシングルクォートでかこっていたのが問題でした。
これだと、「文字列としての\t」で区切るということになってしまいます。
なのでダブルクォートで囲われた元のデータは\tはタブとして扱われているので、認識されません。
というわけで結果、
//かきこみの
function write($comments) {
$number = count($comments) + 1;
$fp = fopen("bbs2.txt",'a');
$comment = sprintf("%s\t%s\t%s\t%s\n",$number,$_POST['name'],$_POST['comment'],time());
fprintf($fp,'%s',$comment);
fclose($fp);
$comments[] = explode("\t",$comment);
return $comments;
}
このようにどちらもダブルクォーテーションで囲む事により、シングルクォートとダブルクォートの問題は解決しました。
これからも忘れないようにしないと。。
しかし、
これはシングルなのに、$commentの中身のタブ文字とかは普通に展開されているのが、軽く不思議だなぁと思ってみたり。。
fprintf($fp,'%s',$comment);