在 php 里,$b =& $a 让两个变量名共享同一个值,function addone(&$value) 则允许函数修改调用时传入的变量。用整数运行下面的例子,就能看到普通赋值、引用赋值和引用传参分别会改动哪些变量。
普通赋值与引用赋值会改动哪些变量
先把整数 1 赋给 $a,再分别用普通赋值和引用赋值创建 $b、$c。给 $c 赋新值之后,检查 $a、$b、$c 的输出。
$a = 1; $b = $a; $c =& $a; $c = 99; var_dump($a, $b, $c); // 99、1、99

执行 $b = $a 后,$b 的值为 1。$c =& $a 让两个变量名指向同一份内容,通过 $c 写入 99 后,$a 和 $c 都读到 99,$b 仍读到 1。用输出结果就能验证这个差异。
函数如何修改调用者传入的变量
普通参数在函数体内递增时,调用者的整数变量保持原值。要让递增反映到调用者,把 & 写在函数定义的参数名前,调用时传入变量即可。
function incrementByValue(int $number): void {
$number++;
}
function incrementByRef(int &$number): void {
$number++;
}
$value = 10;
incrementByValue($value);
var_dump($value); // 10
incrementByRef($value);
var_dump($value); // 11
在 incrementByValue 函数中,参数 $var 是 $val 的副本,递增操作仅作用于副本,外部 $val 保持不变。而在 incrementByRef 中,&$var 声明使得函数内部的 $var 直接绑定到外部的 $val。因此,递增操作直接改变了原始变量的值。这是区分引用传参与普通传参的核心判断标准:观察函数返回后,实参的值是否发生了预期内的变化。
unset() 之后另一个变量还能读取吗
unset() 移除的是指定的变量名。先建立 $b 对 $a 的引用,再执行 unset($a),即可观察 $b 是否还能读取原来的值。
$a = 1; $b =& $a; unset($a); var_dump($b); // 1
执行 unset($a) 后,$a 这个变量名被移除。$b 仍可访问原来的值 1。复制每段代码到以 php demo.php 查看输出。
一次运行,核对赋值、传参和解绑
把下面的完整脚本保存为 references.php,然后执行 php references.php。每次写入后都打印有关变量,方便比较。
<?php declare(strict_types=1);
function addOne(int &$value): void
{
$value++;
}
$original = 10;
$copy = $original;
$alias =& $original;
$alias = 12;
printf("assignment: %d %d %d\n", $original, $copy, $alias);
addOne($original);
printf("parameter: %d %d\n", $original, $alias);
unset($alias);
printf("unset: %d %s\n", $original, isset($alias) ? 'yes' : 'no');
$left = 3;
$right = 7;
[$left, $right] = [$right, $left];
printf("swap: %d %d\n", $left, $right);
预期依次输出 assignment: 12 10 12、parameter: 13 13、unset: 13 no 和 swap: 7 3。最后一段用数组解构完成交换,适合只需要交换两个局部变量的场景。
foreach 按引用遍历后为什么要 unset()
foreach 按引用遍历数组后,循环变量仍和最后一个元素关联。退出循环时用 unset 解除关联,然后再复用同名变量。
$prices = [10, 20];
foreach ($prices as &$price) {
$price += 2;
}
unset($price);
$price = 0;
echo json_encode($prices, JSON_THROW_ON_ERROR), PHP_EOL;
预期输出 [12,22]。在这个示例中省略 unset($price),后续赋值会把最后一个元素改成 0。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











