You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中能否为引用指向的目标赋值(PHP解引用操作相关问题)

PHP 引用赋值嵌套数组元素的正确实现方式

核心正确用法

当你已经完成引用绑定后,直接对引用变量做普通赋值即可修改原数组对应元素,无需额外加&符号:

$arr = ['foo' => ['bar' => 'Hello World']];
// 第一步:绑定引用(仅首次绑定时需要加&)
$ref =& $arr['foo']['bar'];
// 第二步:直接赋值即可修改原数组
$ref = 'fooz';
var_export($arr['foo']['bar']); // 输出:'fooz'

之前错误写法的原因

  • &$ref = 'fooz';:语法错误,&加在变量前仅用于首次绑定引用场景,赋值操作不支持该写法
  • $ref =& 'fooz';:语法错误,=&是引用绑定运算符,右侧必须是变量、数组元素等可被引用的实体,不能是字符串字面量
  • $ref &= 'fooz';:语义错误,&=是按位与赋值运算符,和引用操作完全无关,你看到的异常结果是两个字符串做按位与运算的产物

嵌套数组引用获取函数的Bug修复

你提供的getNestedArrayRef存在核心问题:第一个参数是值传递,递归操作的都是原数组的副本,返回的引用无法对应到原数组元素。修正后代码如下:

/**
 * 获取嵌套数组指定节点的引用
 * @param array $array 要操作的原数组,必须传引用
 * @param array $keys 嵌套键名数组
 * @return mixed 对应节点的引用
 */
function &getNestedArrayRef(&$array, array $keys) {                                                                     
    $key = array_shift($keys);                                                                                         
    if (!is_null($key)) {
        // 可选:节点不存在时自动初始化,避免报错
        if (!isset($array[$key]) || !is_array($array[$key])) {
            $array[$key] = [];
        }                                                                                           
        return getNestedArrayRef($array[$key], $keys);                                                                 
    }                                                                                                                 
    return $array;                                                                                                    
}

// 调用示例
$arr = ['foo' => ['bar' => 'Hello World']];
$ref = &getNestedArrayRef($arr, ['foo', 'bar']);
$ref = '自定义赋值测试';
var_export($arr['foo']['bar']); // 输出:'自定义赋值测试'

内容的提问来源于stack exchange,提问作者Peter Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:15:03