## 基础

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";      // 输出 "Bob, Joe"

    $_4site = 'not yet';    // 合法变量名；以下划线开头
    $i站点is = 'mansikka';  // 合法变量名；可以用中文
    ?>

示例 #2 无效变量名

    <?php
    $4site = 'not yet';     // 非法变量名；以数字开头

PHP 接受任意字节序列作为变量名。不遵循上述命名规则的变量名只能在运行时动态访问。有关如何访问变量的信息，请参阅可变变量。

示例 #3 访问模糊的变量名

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

以上示例会输出：

    bar bar

变量默认始终传值赋值。那也就是说，当表达式的值赋值给变量时，整个原始表达式的值被赋值到目标变量。这意味着，例如，当一个变量的值赋予另外一个变量时，改变其中一个变量的值，将不会影响到另外一个变量。有关这种类型的赋值操作，请参阅表达式一章。

PHP 也提供了另外一种方式给变量赋值：引用赋值。这意味着新的变量简单的引用（换言之，“成为其别名” 或者 “指向”）了原始变量。改动新的变量将影响到原始变量，反之亦然。

使用引用赋值，简单地将一个 & 符号加到将要赋值的变量前（源变量）。例如，下列代码片断将输出“My name is Bob”两次：

    <?php
    $foo = 'Bob';              // 将 'Bob' 赋给 $foo
    $bar = &$foo;              // 通过 $bar 引用 $foo
    $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();    // 无效，因为 test() 没有通过引用返回变量。
    ?>

在 PHP 中声明变量不是必需的，但这是一种非常好的做法。访问未定义的变量将导致 `E_WARNING`（在 PHP 8.0.0 之前，为 `E_NOTICE`）。未定义的变量的默认值为 `null`。isset() 语言结构可用于检测变量是否已初始化。

示例 #4 未初始化变量的默认值

    <?php
    // 未设置和未引用（不使用上下文）的变量。
    var_dump($unset_var);
    ?>

以上示例会输出：

    Warning: Undefined variable $unset_var in ...
    NULL

PHP 允许从未定义的变量自动生成数组（自动创建新数组）。 将元素追加到未定义的变量将创建一个新数组，并且不会生成警告。

示例 #5 未定义变量自动生成数组

    <?php
    $unset_array[] = 'value'; // 不会生成警告。
    ?>

警告

当将一个文件包含在另一个使用相同变量名的文件中时，依赖未初始化变量的默认值是有问题的。

可以使用 unset() 语言结构来销毁变量。

有关变量相关函数的信息，请参阅变量函数参考。

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