基本的な事
PHP の変数はドル記号の後に変数名が続く形式で表されます。
変数名は大文字小文字を区別します。
変数名は、文字
(A-Z
, a-z
,
128から255 までのバイト) で始まり、
任意の数の文字、
数字、アンダースコアが続きます。正規表現を使うと、これは次の
ように表現することができます。
^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
注意:
PHP は Unicode の変数名はサポートしていませんが、
(UTF-8のような)文字エンコーディングによっては、
マルチバイト文字の全てのバイトを可能な範囲にまでエンコードする場合があり、
その結果正しい変数名になる場合があります。
注意:
$this
は特別な変数であり、ここに代入することはできません。
PHP 7.1.0 より前のバージョンでは、
(可変変数 を使った)
間接的な代入 が可能でした。
例1 有効な変数と無効な変数
<?php
$var = 'Bob';
$Var = 'Joe';
echo "$var, $Var"; // outputs "Bob, Joe"
$4site = 'not yet'; // invalid; starts with a number
$_4site = 'not yet'; // valid; starts with an underscore
$täyte = 'mansikka'; // valid; 'ä' is (Extended) ASCII 228.
?>
PHP は、任意のバイトの連続を変数名として受け入れます。
既に述べたルールに従わない変数名は、実行時にのみ動的にアクセスできます。
アクセスする方法については
可変変数
を参照ください。
例2 曖昧な変数名にアクセスする
<?php
${'invalid-name'} = 'bar';
$name = 'invalid-name';
echo ${'invalid-name'}, " ", $$name;
?>
デフォルトでは、変数に代入されるのは常にその値です。
これは、つまり、ある変数にある式を代入する際、元の式の
値全体がコピーされる側の変数にコピーされるということです。
これは、例えば、ある変数の値を他の変数に代入した後で、
これらの変数の1つを変更しても他の変数には影響を与えないという
ことを意味します。この種の代入に関するより詳細な情報については、
式 を参照ください。
PHP には、変数に値の代入を行う別の方法も存在します。それは、
参照による代入 です。
この場合、新規の変数は元の変数を参照するだけです。
(言いかえると、元の変数の"エイリアスを作る"または元の変数を"指す")
新規の変数への代入は、元の変数に影響し、その逆も同様となります。
参照により代入を行うには、代入する変数(ソース変数)の先頭に
アンパサンドを加えます。たとえば、次の簡単なコードは
'My name is Bob
'を二度出力します。
注意すべき重要な点として、変数のみが参照により代入できる
ということがあります。
PHP では変数を初期化する必要はありませんが、
そうするのはとてもよいことです。
初期化されていない場合、
E_WARNING
(PHP 8.0.0 より前のバージョンでは E_NOTICE
)
が発生します。
未定義の変数は、デフォルト値 null
を持ちます。
変数が既に初期化済みかどうかを検知するには、
言語構造 isset() が使えます。
例3 未初期化の変数のデフォルト値
<?php
// Unset AND unreferenced (no use context) variable.
var_dump($unset_var);
?>
Warning: Undefined variable $unset_var in ...
NULL
PHP は、未定義の変数からの配列の autovivification
(新しい配列の自動生成) を許可しています。
未定義の変数に要素を追加する操作は、
新しい配列を生成し、警告は発生しません。
例4 未定義の変数から配列を自動生成する
<?php
$unset_array[] = 'value'; // 警告は発生しません
?>
警告
初期化されていない変数のデフォルト値に依存すると、そのファイルを
include している別のファイルで同名の変数が使用されていた場合に問題を起こします。
変数は、言語構造
unset()
を使って破棄できます。
変数に関連した関数については、
関数リファレンス
を参照ください。