PHP中$parentRef[]引用机制疑问:为何赋值可实现数组追加?
理解PHP中
&$array[]的引用机制 哈哈,我完全懂你看到这段代码能正常运行时的惊讶——这个语法看起来确实有点反直觉,但其实是PHP里引用和数组操作结合的一个有意思的特性。咱们一步步拆解明白:
核心原理:&$arr[]到底做了什么?
当你写$ref = &$arr[]时,PHP会悄悄做两件事:
- 自动在数组
$arr的末尾加一个默认值为null的新元素 - 返回这个新元素的引用,把它赋值给
$ref
这就意味着$ref现在直接“绑”在了数组末尾的那个新位置上,之后你给$ref赋什么值,都会直接写到数组的这个位置里。
你的简化示例为啥能输出123?
看你写的验证代码:
<?php $arr = [1, 2]; $ref = &$arr[]; $ref = 3; foreach($arr as $n) { echo $n; }
执行$ref = &$arr[]之后,$arr其实已经变成[1, 2, null]了,同时$ref指向这个null元素的引用。接着$ref = 3就把这个位置的null改成了3,最终数组就是[1,2,3],所以输出123完全合理。
为啥var_dump($parentRef[])显示null?
你说用var_dump输出$parentRef[]时结果是null,这是因为:
- 如果你直接写
$arr[](不带前面的&),本质是执行了“给数组加一个null元素”的操作,返回的就是这个新元素的当前值——也就是null - 而你代码里用的是
&$parentRef[],拿到的是引用,此时这个引用指向的元素还没被赋值,所以var_dump这个引用时显示的是它当前的null值,但重点是这个引用关联的是数组的位置,后续赋值会直接覆盖这个null
回到你的原始代码逻辑
其实你的这段代码实现了一个相当巧妙的逻辑:
$parentRef = &$elements[$targetPath]->{$contentTypeMap[$contentTypeIdMap[$contentTypeId]]}; if(is_array($parentRef)) { $parentRef = &$parentRef[]; } $parentRef = $element;
- 先拿到目标属性或数组的引用
$parentRef - 如果这个目标是数组,就把
$parentRef换成该数组末尾新元素的引用 - 最后给
$parentRef赋值$element:- 如果目标不是数组:直接把原目标的值改成
$element - 如果目标是数组:把
$element追加到数组的末尾
- 如果目标不是数组:直接把原目标的值改成
这个写法用引用特性简化了逻辑,不用分开写“赋值”和“数组追加”两种情况,确实挺聪明的!
内容的提问来源于stack exchange,提问作者giggo1604
相关产品推荐
相关产品推荐

