文字列
string は、文字が連結されたものです。PHP では、 文字は 1 バイトと同じです。つまり、256 個の異なる文字を使用可能です。 これは、PHP が Unicode をネイティブにサポートしていないことも意味します。 いくつかの Unicode サポートについてはutf8_encode() および utf8_decode() を参照してください。
注意: 文字列が非常に大きくなっても問題ありません。 PHP に課せられる文字列のサイズの実用上の制限はありません。 このため、長い文字列に関して恐れる必要は全くありません。
構文
文字列リテラルは、3 つの異なる方法で指定することが可能です。
引用符
文字列を指定する最も簡単な方法は、引用符 (文字 ') で括ることです。
引用符をリテラルとして指定するには、多くの他の言語と同様にバックスラッシュ (\) でエスケープする必要があります。 バックスラッシュを引用符の前または文字列の最後に置きたい場合は、 二重にする必要があります。この他の文字をエスケープする場合には、 バックスラッシュも出力されることに注意してください! このため、 通常はバックスラッシュ自体をエスケープする必要はありません。
注意: PHP 3 では、この場合、E_NOTICE レベルの警告が出力されます。
注意: 他の二つの構文と異なり、 変数と特殊文字のエスケープシーケンスは、 引用符 (シングルクオート) で括られた文字列にある場合には展開されません。
<?php
echo 'this is a simple string';
echo 'You can also have embedded newlines in
strings this way as it is
okay to do';
// 出力: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';
// 出力: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// 出力: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// 出力: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// 出力: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
二重引用符
文字列が二重引用符 (") で括られた場合、 PHP は、より多くの特殊文字のエスケープシーケンスを理解します。
記述 | 意味 |
---|---|
\n | ラインフィード (LF またはアスキーの 0x0A (10)) |
\r | キャリッジリターン (CR またはアスキーの 0x0D (13)) |
\t | 水平タブ (HT またはアスキーの 0x09 (9)) |
\v | 垂直タブ (VT またはアスキーの 0x0B (11)) (PHP 5.2.5 以降) |
\f | フォームフィード (FF またはアスキーの 0x0C (12)) (PHP 5.2.5 以降) |
\\ | バックスラッシュ |
\$ | ドル記号 |
\" | 二重引用符 |
\[0-7]{1,3} | 正規表現にマッチする文字シーケンスは、8 進数表記の 1 文字です。 |
\x[0-9A-Fa-f]{1,2} | 正規表現にマッチする文字シーケンスは、16 進数表記の 1 文字です。 |
繰り返しますが、この他の文字をエスケープしようとした場合には、 バックスラッシュも出力されます! PHP 5.1.1 より前のバージョンでは、\{$var} のバックスラッシュは出力されません。
しかし、二重引用符で括られた文字列で最も重要なのは、 変数名が展開されるところです。詳細は、文字列のパースを参照ください。
ヒアドキュメント
文字列を区切る別の方法としてヒアドキュメント構文 ("<<<") があります。この場合、ある ID (と、それに続けて改行文字) を <<< の後に指定し、文字列を置いた後で、同じ ID を括りを閉じるために置きます。
終端 ID は、その行の最初のカラムから始める必要があります。 使用するラベルは、PHP の他のラベルと同様の命名規則に従う必要があります。 つまり、英数字およびアンダースコアのみを含み、 数字でない文字またはアンダースコアで始まる必要があります。
非常に重要なことですが、終端 ID がある行には、セミコロン (;) 以外の他の文字が含まれていてはならないことに注意しましょう。 これは、特に ID はインデントしてはならないということ、 セミコロンの前に空白やタブを付けてはいけないことを意味します。 終端 ID の前の最初の文字は、使用するオペレーティングシステムで定義された 改行である必要があることにも注意を要します。 これは、例えば、Macintoshでは \r となります。 最後の区切り文字 (たいていはその後にセミコロンが続きます) の後にもまた、改行を入れる必要があります。
この規則が破られて終端 ID が "clean" でない場合、 終端 ID と認識されず、PHP はさらに終端 ID を探し続けます。 適当な終了 ID がみつからない場合、 スクリプトの最終行でパースエラーが発生します。
ヒアドキュメント構文を、クラスのメンバの初期化に用いることはできません。 他の文字列構文を利用してください。
Example#1 間違った例
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
ヒアドキュメントは二重引用符を使用しませんが、 二重引用符で括られた文字列と全く同様に動作します。 しかし、この場合でも上記のリストでエスケープされたコードを使用することも可能です。 変数は展開されますが、文字列の場合と同様に ヒアドキュメントの内部で複雑な変数を表わす場合には注意が必要です。
Example#2 ヒアドキュメントで文字列を括る例
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
/* 変数を使用するより複雑な例 */
class foo
{
var $foo;
var $bar;
function foo() {
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>
注意: ヒアドキュメントは PHP 4 で追加されました。
変数のパース
スクリプトが二重引用符で括られるかヒアドキュメントで指定された場合、 その中の変数はパースされます。
構文の型には、単純な構文と 複雑な 構文の 2 種類があります。簡単な構文は、最も一般的で便利です。 この構文では、変数、配列値やオブジェクトのプロパティをパースすることが可能です。
複雑な構文は、PHP 4 で導入されました。 この構文は、式を波括弧で括ることにより認識されます。
簡単な構文
ドル記号 ($) を見付けると、 パーサは、有効な変数名を形成することが可能な最長のトークンを取得します。 変数名の終りを明示的に指定したい場合は、変数名を波括弧で括ってください。
$beer = 'Heineken';
echo "$beer's taste is great"; // 動作します。"'" は変数名として無効な文字です。
echo "He drunk some $beers"; // 動作しません。's' は、変数名として有効な文字です。
echo "He drunk some ${beer}s"; // 動作します。
echo "He drank some {$beer}s"; // 動作します。
同様に、配列添字とオブジェクトのプロパティをパースすることも可能です。 配列添字の場合、閉じ角括弧 (']') は添字の終りを意味し、 オブジェクトのプロパティの場合、同じ規則が簡単な変数として適用されます。 しかし、オブジェクトプロパティには、変数の場合のような手法はありません。
<?php
// これらの例は、文字列の内部で配列を使用する際のものです。
// 文字列の外部で使用する場合は、配列の文字列キーは常にクオート
// しましょう。また、{波括弧} も使用しないようにしましょう。
// すべてのエラーを表示するようにします。
error_reporting(E_ALL);
$fruits = array('strawberry' => 'red' , 'banana' => 'yellow');
// シングルクオートの外では動作が異なることに注意してください。
echo "A banana is $fruits[banana].";
// 動作します。
echo "A banana is {$fruits['banana']}.";
// 動作しますが、以下に説明するように
// PHP はまず banana という名前の定数を探します。
echo "A banana is {$fruits[banana]}.";
// 動作しません。波括弧を使用しましょう。これはパースエラーとなります。
echo "A banana is $fruits['banana'].";
// 動作します。
echo "A&nb