
どうもタスです。
プログラムは、変数に代入する数値や文字列などのリテラルを分類する「型」というものを使用します。
phpは動的型付け言語のため、変数を使用する際に明示的に型を宣言する必要はないですが、全ての変数は型を持っていて、内部的には明確に分類されています。
そこで今回は、型のうちの一つである「string型」について基本的な構文について説明します。
「string型」の応用的な使い方についての説明は以下をご覧ください。
「boolean」型もしくは「integer」型についての説明は以下の記事を参考にしてください。
「float」型もしくは「double」型についての説明は以下の記事を参考にしてください。
この記事の目次
PHPの10種類の基本型
PHPは、10種類の基本型をサポートしており、以下のとおりになります。
4種類のスカラー型
- 論理値:boolean
- 整数:integer
- 浮動小数点数:float, double
- 文字列:string
4種類の複合型
- 配列:array
- オブジェクト:object
- callable
- iterable
2種類の特別な型
- リソース:resource
- ヌル:NULL
上記の中で、今回は「文字列:string」に焦点を当てています。
文字列型「stirng」の説明
文字を連結した文字列を表す型を「string」と言います。
PHPは、全ての文字列が可変長文字列であり、固定長文字列は存在しません。
PHP7.0.0以降は、64ビット版の文字列の長さに関する特別な制限はありませんが、32ビット版及びそれ以前のPHPでは、文字列の最大長は2GBに制限されます。
文字列リテラルは、以下の4つの異なる構文により指定可能です。
・引用符
・二重引用符
・ヒアドキュメント構文
・nowdoc構文(PHP5.3.0以降)
以下にそれぞれの特徴を記述します。
引用符
文字列を指定する最も簡単な方法は、引用符(シングルクォーテーション「'」)で文字列を括ることです。
なお、引用符自体をリテラルで指定したい場合は、バックスラッシュ「\」でエスケープする必要があります。
さらに、バックスラッシュ自体をリテラルに指定する場合は、二重に記述する必要があります(\\)。
それ以外でバックスラッシュを記述した場合は、単なるバックスラッシュ文字として扱われます。
つまり、「\n」や「\r」はエスケープシーケンスとしての効果は得られず、そのままの文字列として出力されます。
なお、シングルクォーテーションを引用符として使用した場合は、その中で変数を指定しても展開されません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php // 出力:TasuLifeのブログです。 echo 'TasuLifeのブログです。'; // 出力:TasuLifeのブログです。 ようこそおいで下さいました。 一緒にPHPを勉強しましょう! // 改行されない。 echo 'TasuLifeのブログです。 ようこそおいで下さいました。 一緒にPHPを勉強しましょう!'; // 出力:TasuLife's Blog // シングルクォーテーションをエスケープ echo 'TasuLife\'s Blog'; // 出力:そのドライブを指定してね。C:\tasulife\nazofile.txt // バックスラッシュをエスケープ echo 'そのドライブを指定してね。C:\\tasulife\\nazofile.txt'; // 出力:左は改行にはならないよ。\n // 「\n」はエスケープ対象ではない echo '左は改行にはならないよ。\n'; // 出力:このブログの名称は$strです。 // シングルクォーテーション内では変数は展開されない $str = 'tasulife'; echo 'このブログの名称は$strです。'; |
二重引用符
引用符としてダブルクォーテーションを指定した場合は、以下のエスケープシーケンスを特殊な文字として解釈します。
\n:ラインフィード(LFまたはアスキーの0x0A(10))
\r:キャリッジリターン(CRまたはアスキーの0x0D(13))
\t:水平タブ(HTまたはアスキーの0x09(9))
\v:垂直タブ(VTまたはアスキーの0x0B(11))(PHP5.2.5以降)
\e:エスケープ(ESCあるいはアスキーの0x1B(27))(PHP5.4.4以降)
\f:フォームフィード(FFまたはアスキーの0x0C(12))(PHP5.2.5以降)
\\:バックスラッシュ
\$:ドル記号
\”:二重引用符
\[0-7]{1,3}:正規表現にマッチする文字シーケンスは、8進数表記の1文字です。1バイトに収まらない部分は、何もメッセージを出さずにオーバーフローします
(そのため、”\400″ === “\000″となります)。
\x[0-9A-Fa-f]{1,2}:正規表現にマッチする文字シーケンスは、16進数表記の1文字です。
\u{[0-9A-Fa-f]+}:正規表現にマッチする文字シーケンスは、Unicodeのコードポイントです。そのコードポイントのUTF-8表現を文字列として出力します(PHP7.0.0で追加されました)。
引用符でも言ったように、上記以外の文字をエスケープしようとした場合には、バックスラッシュも文字として出力されます。
ただし、シングルクォーテーション括りに対してダブルクォーテーション括りで大きく異なる点は、変数が展開されることです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php // 出力:TasuLifeのブログです。 echo "TasuLifeのブログです。"; // 出力1:改行されますよ。 // 出力2:ほうらね。 // 改行が有効 echo "改行されますよ。\nほうらね。"; // 出力:TasuLife Blog // タブが有効 echo "TasuLife\tBlog"; // 出力:TasuLife$(ドル) // タブが有効 echo "TasuLife\$(ドル)"; // 出力:ほ // UTF-8が解釈される echo "\u{307B}"; // 出力:このブログの名称はtasulifeです。 // ダブルクォーテーション内では変数が展開される $str = 'tasulife'; echo "このブログの名称は{$str}です。"; |
ヒアドキュメント
文字列を表す別の方法として、ヒアドキュメント構文があります。
これは、です。
言葉だけでは分かり辛いので、以下の例文を見てください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php echo <<<EOM あいうえお<br> かきくけこ<br> さしすせそ EOM; // 変数に代入することもできます $ho = "ほ"; $str = <<<EOM たちつてと<br> なにぬねの<br> はひふへ{$ho} EOM; echo $str; |
出力例
あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへほ
なお、IDには変数の命名規則などと同様に「英数字およびアンダースコアのみを含み、 数字でない文字またはアンダースコアで始まる」ルールが適用されます。
ここで使用している「EOM」は「End Of Message」という意味がありますが、上記のとおり、好きな文字列を使用して構いません。
ヒアドキュメントはダブルクォーテーションで括られていませんが、ダブルクォーテーションで括られた場合と同様の動作になります。
よって、二重引用符でお伝えしたエスケープコードを使用することが可能で、且つ変数も展開されます。
特に重要なこととして、終端IDの行はセミコロン以外の文字を記述しないことです。
インデントや空白、タブなどは記述することでパースエラーになるので注意が必要です。
Nowdoc
ヒアドキュメントと似ていますが、異なる点としてはヒアドキュメントはパース対象でダブルクォーテーションで括った場合と同じ扱いになりますが、Nowdocはパース対象とはならず、シングルクォーテーションで括った場合と同様の扱いになります。
この識別子の命名規則はヒアドキュメントと同様で、且つ変数も展開されえることがありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php echo <<<'EOM' あいうえお<br> かきくけこ<br> さしすせそ EOM; $ho = "ほ"; $str = <<<'EOM' たちつてと<br> なにぬねの<br> はひふへ{$ho} EOM; echo $str; |
出力例
あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへ{$ho}