PHP变量可直接用=重新赋值,无需关键字或函数;引用赋值后对被引用变量赋值会影响原变量,但对引用变量赋值会断开关联;超全局变量虽可赋值但应避免;作用域内需global声明才能修改全局变量,static变量值跨调用保留。

PHP变量重新赋值就是直接用=再写一次
PHP是弱类型动态语言,变量没有“只读”属性,只要已声明,随时能用=覆盖原值。不需要额外关键字或函数,也不用先unset()再定义。
常见错误是误以为要加var、let或const(那是JS),或者以为要调用类似set()的方法——PHP里没有这种东西。
-
$name = "Alice"; $name = "Bob";—— 合法且最常用 -
$count = 5; $count = $count + 1;—— 原值参与运算后赋回,等价于$count++ -
$data = ["a"]; $data = null;—— 类型可完全改变,从数组变null
引用赋值时重新赋值会断开引用
如果用&做了引用($b = &$a;),对$a重新赋值,$b的值也会变;但对$b重新赋值,就只是让$b指向新数据,不再和$a关联。
容易踩的坑:以为$b = "new";之后$a也会变——其实不会,引用关系在$b被重新赋值那一刻就解除了。
立即学习“PHP免费学习笔记(深入)”;
-
$a = 10; $b = &$a; $a = 20;→$b也是20 -
$a = 10; $b = &$a; $b = 30;→$a也变成30 -
$a = 10; $b = &$a; $b = "hello";→$a也变成"hello"(仍是引用) -
$a = 10; $b = &$a; $b = 42; $b = "bye";→$a仍是42,$b现在是"bye"(引用已被覆盖)
超全局变量(如$_POST)也能重新赋值,但通常不该这么做
语法上完全允许:$_GET = ["id" => 123];,PHP不会报错。但这样做会掩盖原始请求数据,破坏可追溯性,调试时容易懵。
更安全的做法是复制一份再操作:
- ✅
$safe_input = $_POST; $safe_input["status"] = "processed"; - ❌
$_POST["status"] = "processed";(改原始数组) - ❌
$_POST = ["fake" => true];(整个替换,丢失真实输入)
框架或路由中间件里偶尔会重写$_SERVER某些键(比如REQUEST_URI),但那是明确意图下的底层操作,普通业务逻辑别碰。
重新赋值不影响变量作用域,但要注意global和static
在函数内对全局变量重新赋值,不加global声明的话,只会创建同名局部变量,原全局变量不变。
static变量比较特殊:它只在首次执行时初始化,后续调用中重新赋值会生效,但下一次函数调用时仍保留上次的值。
-
function foo() { $x = 10; $x = 20; echo $x; }→ 每次都输出20,不保留 -
function bar() { static $y = 10; $y = $y + 1; echo $y; }→ 第一次11,第二次12,依此类推 -
function baz() { global $z; $z = 5; }→ 必须声明global才能修改外部$z
真正容易被忽略的是:重新赋值本身不触发任何钩子或监听,PHP没有变量变更的回调机制。如果需要响应式更新,得自己封装类、用__set()魔术方法,或者借助外部工具(如ReactPHP的事件循环)。



















