基本的な事
PHP の変数はドル記号の後に変数名が続く形式で表されます。
変数名は大文字小文字を区別します。
変数名は、PHPの他のラベルと同じルールに従います。
有効な変数名は文字またはアンダースコアから始まり、任意の数の文字、
数字、アンダースコアが続きます。正規表現によれば、これは次の
ように表現することができます。
^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
注意:
ここで言うところの文字とはa-z、A-Z、128から255まで
(0x80-0xff
)のバイトを意味します。
注意:
$this
は特別な変数であり、ここに代入することはできません。
PHP 7.1.0 より前のバージョンでは、
(可変変数 を使った)
間接的な代入 が可能でした。
変数関連の関数に関する情報については、
変数関数リファレンス
を参照ください。
デフォルトでは、変数に代入されるのは常にその値です。
これは、つまり、ある変数にある式を代入する際、元の式の
値全体がコピーされる側の変数にコピーされるということです。
これは、例えば、ある変数の値を他の変数に代入した後で、
これらの変数の1つを変更しても他の変数には影響を与えないという
ことを意味します。この種の代入に関するより詳細な情報については、
式 を参照ください。
PHP には、変数に値の代入を行う別の方法も存在します。それは、
参照による代入 です。
この場合、新規の変数は元の変数を参照するだけです。
(言いかえると、元の変数の"エイリアスを作る"または元の変数を"指す")
新規の変数への代入は、元の変数に影響し、その逆も同様となります。
参照により代入を行うには、代入する変数(ソース変数)の先頭に
アンパサンドを加えます。たとえば、次の簡単なコードは
'My name is Bob
'を二度出力します。
注意すべき重要な点として、名前のある変数のみが参照により代入できる
ということがあります。
PHP では変数を初期化する必要はありませんが、そのようにするのはとてもよいことです。
初期化されていない変数の値は、状況に応じたその型のデフォルト値
- boolean なら false
、integer や float ならゼロ、
文字列 (echo で使う場合など)
なら空の文字列、配列なら空の配列となります。
例1 初期化されていない変数のデフォルト値
<?php
// 設定も参照もされていない (使用中のコンテキストではない) 変数は NULL となります
var_dump($unset_var);
// boolean として使用すると、出力は 'false' となります (この構文の詳細は三項演算子を参照ください)
echo $unset_bool ? "true\n" : "false\n";
// 文字列として使用すると、出力は 'string(3) "abc"' となります
$unset_str .= 'abc';
var_dump($unset_str);
// integer として使用すると、出力は 'int(25)' となります
$unset_int += 25; // 0 + 25 => 25
var_dump($unset_int);
// float として使用すると、出力は 'float(1.25)' となります
$unset_float += 1.25;
var_dump($unset_float);
// 配列として使用すると、出力は array(1) { [3]=> string(3) "def" } となります
$unset_arr[3] = "def"; // array() + array(3 => "def") => array(3 => "def")
var_dump($unset_arr);
// オブジェクトとして使用し、新しい stdClass オブジェクト (http://www.php.net/manual/ja/reserved.classes.php を参照ください)
// を作成すると、出力は object(stdClass)#1 (1) { ["foo"]=> string(3) "bar" } となります
$unset_obj->foo = 'bar';
var_dump($unset_obj);
?>
初期化されていない変数のデフォルト値に依存すると、そのファイルを
include している別のファイルで同名の変数が使用されていた場合などに問題を起こします。
初期化されていない変数を使用すると、
E_WARNING
(PHP 8.0.0 より前のバージョンでは E_NOTICE
) レベルのエラーが発生します。
しかし、初期化されていない配列に要素を追加する場合はエラーにはなりません。
変数が初期化されているかどうかの判断には、isset
を使用します。