PHP 变量:声明、类型、作用域、引用赋值
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() 判断已设置