第 12章変数

基本的な事

PHP の変数はドル記号の後に変数名が続く形式で表されます。 変数名は大文字小文字を区別します。

変数名は、PHPの他のラベルと同じルールに従います。 有効な変数名は文字またはアンダースコアから始まり、任意の数の文字、 数字、アンダースコアが続きます。正規表現によれば、これは次の ように表現することができます。 '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

注意: ここで言うところの文字とはa-z、A-Z、127から255まで (0x7f-0xff)のアスキー文字を意味します。

ティップ: 付録R もご覧になるとよいでしょう。

変数関連の関数に関する情報については、 変数関数リファレンス を参照ください。

$var = 'Bob';
$Var = 'Joe';
echo "$var, $Var";      // "Bob, Joe"を出力します。

$4site = 'not yet';     // 無効:数字で始まっている。
$_4site = 'not yet';    // 有効:アンダースコアで始まっている。
$täyte = 'mansikka';    // 有効:'ä' はアスキーコード228です。

PHP 3では、変数は常にその値により代入されていました。 これは、つまり、ある変数にある式を代入する際、元の式の 値全体がコピーされる側の変数にコピーされるということです。 これは、例えば、ある変数の値を他の変数に代入した後で、 これらの変数の1つを変更しても他の変数には影響を与えないという ことを意味します。この種の代入に関するより詳細な情報については、 を参照ください。

PHP 4以降では、変数に値の代入を行う別の方法を提供します。それは、 参照による代入 です。 この場合、新規の変数は元の変数を参照するだけです。 (言いかえると、元の変数の"エイリアスを作る"または元の変数を"指す") 新規の変数への代入は、元の変数に影響し、その逆も同様となります。

参照により代入を行うには、代入する変数(ソース変数)の先頭に アンパサンドを加えます。たとえば、次の簡単なコードは 'My name is Bob'を二度出力します。

<?php
$foo
= 'Bob' ;               // 値'Bob'を$fooに代入する。
$bar = & $foo ;               // $fooを$barにより参照
$bar = "My name is $bar" ;   // $barを変更...
echo $bar ;
echo
$foo ;                  // $fooも変更される。
?>

注意すべき重要な点として、名前のある変数のみが参照により代入できる ということがあります。

<?php
$foo
= 25 ;
$bar = & $foo ;       // これは有効な代入です。
$bar = &( 24 * 7 );   // 無効です。名前のない式を参照しています。

function test () {
   return
25 ;
}

$bar = & test ();     // 無効。
?>

PHP では変数を初期化する必要はありませんが、そのようにするのはとても よいことです。初期化されていない変数の値は、その型のデフォルト値 - FALSE 、ゼロ、空の文字列あるいは空の配列となります。

例 12-1. 初期化されていない変数のデフォルト値

<?php
echo ( $unset_bool ? "true" : "false" ); // false
$unset_int += 25 ; // 0 + 25 => 25
echo $unset_string . "abc" ; // "" . "abc" => "abc"
$unset_array [ 3 ] = "def" ; // array() + array(3 => "def") => array(3 => "def")
?>

初期化されていない変数のデフォルト値に依存すると、そのファイルを include している別のファイルで同名の変数が使用されていた場合などに 問題を起こします。また、 register_globals が on の場合には重大な セキュリティリスク を抱えることになります。初期化されていない変数を使用すると、 E_NOTICE レベルのエラーが発生します。 しかし、初期化されていない配列に要素を追加する場合はエラーにはなりません。 変数が初期化されているかどうかの判断には、 isset() を使用します。