文字列


文字列リテラル

数値と同様に、文字列もまたひとつのデータ型であり、リテラルを記述することができます。 文字列リテラルは、PHP では三つの書き方があり、それぞれに特徴があります。

ひとつは、引用符 ' で文字列を囲う方法です。 引用符で囲まれたテキストは、引用符をのぞいてすべてそのまま評価されます。 文字列に引用符を指定したい場合は、バックスラッシュ \ の直後に ' を指定するエスケープ文字 \' を書きます。 \' 以外の場合のバックスラッシュはそのまま解釈されるため、C 言語などのように \\ と記述する必要はありません。

<?php
	echo 'I\'am a cat';
?>

引用符による文字列の特徴は、エスケープ文字 \' を除いてテキストに忠実に従うところにあります。 引用符で括られた空間はすべてが文字列リテラルの対象となるため、改行やタブ文字もそのまま文字列として認識されます。

<?php
	echo '「Hollo World」
「Hello World」
さわやかなテスト出力が、真っ黒なプロンプトにこだまする。';
?>

このプログラムも、問題なく動作します。 文字列リテラルは、改行やタブ文字が含まれていても、閉じ引用符まではすべて文字列リテラルの一部と認識されます。 しかし、単純に文字列リテラルの行末に改行を含めたい場合、次のように記述するのは可読性の面からナンセンスです。

'Kitty on your lap
';

もちろん正常に実行されますが、書き方としてマナーが悪いと考えられます。 このような場合、より多くのエスケープ文字を使うことができる二重引用符 " で括った文字列を使います。 二重引用符の文字列リテラルは、改行やタブ文字などのエスケープ文字を使うことができます。

エスケープ文字意味
\nラインフィード(LFまたはアスキーの0x0A (10))
\rキャリッジリターン (CRまたはアスキーの0x0D (13))
\t水平タブ(HTまたはアスキーの0x09 (9))
\\バックスラッシュ
\$ドル記号
\"2重引用符
\[0-7]{1,3}正規表現にマッチする文字シーケンスは、8進数表記の1文字です。
\x[0-9A-Fa-f]{1,2}正規表現にマッチする文字シーケンスは、16進数表記の1文字です。

例えば改行文字ならば \n、タブならば \t と記述します。 \[0-7]{1,3} と \x[0-9A-Fa-f]{1,2} は、8進数または16進数を用いて文字コードを直接指定することができます。 例えば、ASCII コードの A を指定したい場合は \x41 と書きます。

因みに、PHP の文字列はすべて 1 バイト単位で、Unicode などのマルチバイト文字をネイティブでサポートしていません。 そのため、Unicode を用いるには専用の関数を使う必要がありますが、これについては割愛します。

<?php
	echo "Kitty on your lap\n";
	echo "\x41\t\x42\x09\\n";
?>

このプログラムの最初の echo では、文字列の末尾にエスケープ文字 \n を指定しています。 これによって、改行文字を表現することができます。 エスケープ文字は、テキストで表現できない文字を表現する手段として便利なのです。 二重引用符の文字列内で \n や \t などのエスケープ文字を書きたければ、バックスラッシュを続けて \\ と記述し \\n とすれば問題ありません。


ヒアドキュメント

文字列を処理するスクリプトが中心となる PHP 言語では、長文を文字列リテラルとして記述する手段としてヒアドキュメントがあります。 事実上、機能としては二重引用符の文字列と同じですが、開始記号と終端記号を自分で設定することができます。 ヒアドキュメントは <<< から始まります。

<<<ID

ID には、適当な終端記号となる識別子を指定します。 この ID が発見されるまで、PHP はその間のテキストをすべて文字列リテラルと判断します。

終端記号の行は、セミコロン以外を含んではなりません。 セミコロン以外は、その行のすべてのテキストが終端記号として判定されようとするため空白文字などがある場合は終端が発見されなくなってしまいます。

<?php
	echo <<<EOF
「Hollo World」
「Hello World」
さわやかなテスト出力が、真っ黒なプロンプトにこだまする。
EOF;
?>

このプログラムでは、ヒアドキュメントの終端記号として EOF を指定しています。 <<<EOF の次の行から EOF が発見されるまでのテキストはすべて文字列リテラルと判定されます。



前のページへ戻る次のページへ