PHP入門 ≫ LESSON3 文字(文字列)

文字(文字列)の基本

文字や文字列もデータとして扱うことができます。文字列は次のように表します。

"Mojiretsu"
'Mojiretsu'
'123'

ダブルクォート(")かシングルクォート(')で囲みます。
'123'もただの「123」だけなら数値の123ですが、↑の場合は文字列になります。 この二つ、どちらでもかまわないのですが、違いがあります。ダブルクォートを使うと変数やエスケープ文字を評価してくれます。(エスケープ文字については次を参照)

シングルクォートを使うと、変数やエスケープ文字を評価せずにそのままの文字列として評価されます。

評価ってなに!?と思うでしょうが、とりあえず試してみましょう。

$moji = 'Hello';

$hensu = "$moji\nWorld.";
echo "$hensu\n";

$hensu2 = '$moji\nWorld.';
echo $hensu2;

結果は以下。

Hello
World.
$moji\nWorld.

おわかりでしょうか?
普通$で始まる部分は変数と判断されます。また、\nは改行を表すエスケープ文字です。

最初の$hensuにはダブルクォートで囲った文字列【変数$mojiと\nとWorld.を組み合わせた文字列】を代入しました。
変数$mojiと\nは評価されたので、変数$mojiの部分には先に定義した$mojiの値が入り、 \nは改行を表す文字として評価されたのです。

また、変数と次の文字がごっちゃになってどこまでが変数だかわからないことがあるので、そういう場合のために   
"${moji}abc"
というように{}で変数名を囲います

一方、シングルクォートで同じ文字列を囲った場合、変数$mojiと\nは評価されずにそのままただの'$moji'という5文字の文字列と'\n'という二文字の文字列として扱ってしまいます。 よって、変数$mojiの値は変換されず、\nは改行としてみなされません。
当然、{}で変数名を囲っても、{}までもそのまんま評価されてしまいます。



エスケープシーケンス

エスケープシーケンスとは、逆スラッシュ”\”を直前に付けた文字のことです。(Windows環境では¥の半角文字になります)
それぞれ意味を持ち、評価された時にその意味通りに解釈されます。

エスケープシーケンス一覧
\n改行
おそらく一番よく使うことになるでしょう。
\rリターン
一文字戻ります。
\tタブ
\f改ページ
\aベル
\eエスケープ
\R\n、\r、\r\nを表す
\0538進で文字コードを指定[\で始まる8進数](この例は+)
\x6616進で文字コードを指定[\xで始まる16進数](この例はf)
\cCコントロール文字(この例はコントロールc)

$hensu = "改行\nします。";
echo $hensu;

結果は以下。

改行
します。

展開されるようにダブルクォートで囲って試してみてください。

たまたまエスケープシーケンスと同じ文字列になってしまったが、エスケープシーケンスとして扱って欲しくない場合は、展開しないシングルクォートで囲むか、\\で逆スラッシュを表すので、\の前にもう一つ\を付けてエスケープの意味を無効にして下さい。

エスケープ

たまたま、シングルクォートで囲った中にシングルクォート文字が出てきてしまう場合があります。ダブルクォートで囲った中でも同様です。
つまり、

$hensu = 'o'clock';

ってな場合ですね。
これは当然怒られます。

$hensu = "moji"retu";

これでも同じです。2回目のクォートで、文字列が終わったと判断してしまうので、そっから先が変だと怒られます。

シングルクォートで囲う間にダブルクォートを使ったり、その逆の場合は当然問題ありません。

が、どうしても同じ種類のクォートを途中で使いたい場合は、中のクォートをエスケープ(文字の前に逆スラッシュを使う)します。

$hensu = 'o\'clock';
echo "$hensu\n";

$hensu = "moji\"retu";
echo "$hensu\n";

結果は以下。

o'clock
moji"retu

また、先ほどから例文のechoコマンドの部分で何度か使っていますが、最初に$がつく文字列は変数を表してしまうのですが、クォートと同様に逆スラッシュを前に付けると、ただの文字”$”であると判断してくれて、変数として展開しません。

困った時のエスケープ

環境とか文字コードによりますが、たまに日本語表示がおかしなことになる場合があります。その場合、日本語文字の前にスラッシュをいれると上手くいく場合があります。

$hensu = "表\示";
echo "$hensu\n";

テンプレートエンジンSmartyとか使ってるとたまになります。
何か表示がおかしい!という場合は、とにかく逆スラッシュを入れて文字をエスケープしてみて下さい。

文字の結合

文字を結合させるにはどうすればいいか?
前の項目でやったように、ダブルクォートで囲って続けて書きます。その時、変数名と他の文字がごっちゃにならないように{}で変数名を囲うのを忘れずに。

もう一つ、文字を連結する演算子があります。
”.”演算子で連結できます。

$moji = 'Hello';

$hensu = "${moji}World ${moji}";
echo "$hensu\n";

$hensu2 = $moji . 'World ' . $moji;
echo $hensu2;

結果は以下。

HelloWorld Hello
HelloWorld Hello

また、+や-演算子と同様、”.=”で左に定義した変数に連結&代入することができます。

$moji = 'Hello';

$moji .= " World.";
echo $moji;

結果は以下。

Hello World.



文字コードの話

プログラムは普通のファイルに保存するのですが、このとき文字コードを指定できます。 文字コードについて詳しくは、ホームページ作成の「HTMLを書いてみよう」の最後にちょっと説明しています。

PHPのプログラムは大抵CGIとして利用することが多いので、表示するHTMLの文字コードとあわせてプログラムの文字コードを指定保存するとだいたい問題ありません。

最近の傾向としてPHPのプログラムでもUTF8を使うのが一般的です。
UTF8のBOM無し、という条件で保存してください。
このBOMというのは、特定のアプリケーションがUTFの種類を判定するためにつけられるものですが、それ以外だと結構動作のジャマになってしまう場合があります。
PHPプログラムの場合は基本的に抜いた方式で保存しましょう。



ページのトップへ戻る