## 基本的な事

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';    // valid; starts with an underscore
    $täyte = 'mansikka';    // valid; 'ä' is (Extended) ASCII 228.

例2 無効な変数名

    <?php
    $4site = 'not yet';     // invalid; starts with a number

PHP は、任意のバイトの連続を変数名として受け入れます。 既に述べたルールに従わない変数名は、実行時にのみ動的にアクセスできます。 アクセスする方法については 可変変数 を参照ください。

例3 曖昧な変数名にアクセスする

    <?php
    ${'invalid-name'} = 'bar';
    $name = 'invalid-name';
    echo ${'invalid-name'}, " ", $$name;

上の例の出力は以下となります。

    bar bar

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

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

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

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

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

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

    <?php
    // 関数宣言でリファレンスを返すことを示す & がないことに注意してください。
    // つまり、この関数はリファレンスを返さないので、結果をリファレンスで代入できません。
    function test()
    {
       $original = 25;
       return $original;
    }

    // 注意: notice が発生しますが、リファレンスでない値が代入されます。
    $result1 = &test();        // 無効。なぜなら、test() は変数をリファレンスで返していないからです。
    var_dump($result1);

    // この関数はリファレンスを返すものとして定義されていますが、変数を返してはいません。
    function &test2()
    {
        return 26;             // 無効。なぜなら、返される値が変数のリファレンスではないからです。
    }

    // 注意: リファレンスでない値が代入されます。
    $result2 = &test2();
    var_dump($result2);

PHP では変数を初期化する必要はありませんが、 そうするのはとてもよいことです。 初期化されていない場合、 `E_WARNING` (PHP 8.0.0 より前のバージョンでは `E_NOTICE`) が発生します。 未定義の変数は、デフォルト値 `null` を持ちます。 変数が既に初期化済みかどうかを検知するには、 言語構造 isset() が使えます。

例4 未初期化の変数のデフォルト値

    <?php
    // Unset AND unreferenced (no use context) variable.
    var_dump($unset_var);

上の例の出力は以下となります。

    Warning: Undefined variable $unset_var in ...
    NULL

PHP は、未定義の変数からの配列の autovivification (新しい配列の自動生成) を許可しています。 未定義の変数に要素を追加する操作は、 新しい配列を生成し、警告は発生しません。

例5 未定義の変数から配列を自動生成する

    <?php
    $unset_array[] = 'value'; // 警告は発生しません
    var_dump($unset_array);

警告

初期化されていない変数のデフォルト値に依存すると、そのファイルを include している別のファイルで同名の変数が使用されていた場合に問題を起こします。

変数は、言語構造 unset() を使って破棄できます。

変数に関連した関数については、 関数リファレンス を参照ください。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open