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
相关产品推荐
相关产品推荐

