PHP 变量:声明、类型、作用域、引用赋值

小飞兽 PHP 12 次阅读 2026-07-16

PHP 变量基础

变量是存储数据的容器。PHP 是弱类型语言,变量类型由值自动决定,无需声明类型。

声明变量

<?php\n$name = "张三";     // 字符串\n$age = 25;          // 整数\n$price = 99.9;      // 浮点数\n$is_active = true;  // 布尔值\n\n// 输出\necho $name;         // 张三\necho $age;          // 25\necho $price;        // 99.9\necho $is_active;    // 1(true 显示为 1)\n?>

变量命名规则

    • $ 符号开头
    • 变量名只能包含字母、数字、下划线 A-Za-z0-9_
    • 不能以数字开头
    • 区分大小写
    <?php\n$name  = "正确";     // ✓\n$name2 = "正确";     // ✓\n$_name = "正确";     // ✓\n$2name = "错误";     // ✗ 不能以数字开头\n$name-a = "错误";    // ✗ 不能有连字符\n?>

    数据类型

    八种数据类型

    <?php\n// 4 种标量类型\n$int    = 42;           // 整数(integer)\n$float  = 3.14;         // 浮点数(float/double)\n$string = "你好";       // 字符串(string)\n$bool   = true;         // 布尔值(boolean)\n\n// 4 种复合类型\n$arr    = [1, 2, 3];   // 数组(array)\n$obj    = new stdClass(); // 对象(object)\n$nul    = null;         // null\n// resource(资源类型,如数据库连接)\n?>

    获取变量类型

    <?php\n$x = 42;\necho gettype($x);        // integer\n\n$x = "hello";\necho gettype($x);        // string\n\n// 详细类型(含子类型)\nvar_dump($x);            // string(5) "hello"\n?>

    类型转换

    <?php\n// 自动类型转换\n$sum = "5" + 2;          // 字符串 "5" 自动转为整数 5,结果 7\n\n// 强制类型转换\n$num = (int)"42";        // 42\n$num = (float)"3.14";    // 3.14\n$num = (string)42;       // "42"\n$num = (bool)1;          // true\n$num = (array)"hello";   // ["hello"]\n\n// intval / floatval / strval\n$n = intval("123");      // 123\n$f = floatval("3.14");   // 3.14\n$s = strval(42);         // "42"\n?>

    可变变量

    可变变量使用一个变量的值作为另一个变量的名称。

    <?php\n$name = "张三";\n$$name = "住在绍兴";  // 创建一个名为 $张三 的变量\n\necho $张三;           // 住在绍兴\necho $$name;          // 住在绍兴(解析为 $张三\n?>

    实用场景:动态设置属性

    <?php\n$field = "email";\n$value = "zhang@example.com";\n\n$data = new stdClass();\n$data->$field = $value;  // 等于 $data->email = $value\n\necho $data->email;       // zhang@example.com\n?>

    引用赋值 vs 值赋值

    值赋值(默认)

    <?php\n$a = 10;\n$b = $a;       // 值复制\n$a = 20;\n\necho $a;       // 20\necho $b;       // 10(不受影响)\n?>

    引用赋值(用 &)

    <?php\n$a = 10;\n$b = &$a;      // 引用赋值,$b 指向 $a 的内存地址\n$a = 20;\n\necho $a;       // 20\necho $b;       // 20($a 变,$b 也变)\n\n$b = 30;       // 修改 $b 也影响 $a\necho $a;       // 30\n?>

    引用赋值的实用场景

    <?php\n// 函数参数用引用传递,可以修改外部变量\nfunction addOne(&$num) {\n    $num++;\n}\n\n$count = 0;\naddOne($count);\naddOne($count);\naddOne($count);\necho $count;   // 3\n\n// 引用返回\nfunction &getArray() {\n    static $data = [];\n    return $data;\n}\n$arr = &getArray();\n$arr[] = "新元素";\nprint_r(getArray()); // [''新元素'']\n?>

    变量作用域

    1. 局部变量(local)

    <?php\nfunction test() {\n    $local_var = "局部变量";  // 只在函数内有效\n    echo $local_var;\n}\ntest();           // 输出:局部变量\necho $local_var;  // 报错:未定义\n?>

    2. 全局变量(global)

    <?php\n$global_var = "全局变量";\n\nfunction test() {\n    global $global_var;  // 在函数内访问全局变量\n    echo $global_var;    // 全局变量\n}\ntest();\n\necho $GLOBALS['global_var']; // 也可以通过 $GLOBALS 超全局访问\n?>

    3. 静态变量(static)

    <?php\nfunction counter() {\n    static $count = 0;   // 静态变量,函数结束后不销毁\n    $count++;\n    echo $count . "\\n";\n}\n\ncounter();  // 1\ncounter();  // 2\ncounter();  // 3\necho $count; // 报错:$count 是局部变量,外部无法访问\n?>

    4. 超全局变量

    <?php\n// 超全局变量在所有作用域都可用\n// $_GET, $_POST, $_REQUEST, $_SESSION, $_COOKIE, $_SERVER, $GLOBALS 等\n\nfunction test() {\n    echo $_GET['id'] ?? '';     // 任何函数内直接访问\n    echo $GLOBALS['name'];      // 通过 $GLOBALS 访问全局变量\n}\n?>

    empty() / isset() / unset()

    <?php\n$var = "";\n\nempty($var);    // true(空字符串、0、null、false 都返回 true)\nisset($var);    // true(已设置且不为 null)\nunset($var);    // 销毁变量\nisset($var);    // false(已销毁)\n\n$var2;\nisset($var2);   // false(从未声明)\nempty($var2);   // true\n?>

    预定义变量(超全局)

    • $_GET — URL 参数
    • $_POST — POST 表单数据
    • $_REQUEST — GET + POST
    • $_SESSION — 会话数据
    • $_COOKIE — Cookie 数据
    • $_SERVER — 服务器信息
    • $_FILES — 上传文件
    • $GLOBALS — 所有全局变量

    总结

    • 变量以 $ 开头,弱类型自动推断
    • &$var 是引用赋值,两变量指向同一内存
    • static 变量在函数调用间保持值
  • global 关键字在函数内访问全局变量
  • empty() 判断空值,isset() 判断已设置