feat(parser): 添加对嵌套 list() 解构赋值的支持

- 在 AssignOpTrait 中实现嵌套列表解构逻辑
- 添加临时变量生成用于处理嵌套数组
- 集成 parseAssignToList 方法处理嵌套 list 结构
- 保持原有非嵌套情况下的行为不变
- 添加完整的嵌套 list 解构功能测试用例
- 确保多层嵌套的列表解构能够正确执行
pull/1/head
韩天峰 3 months ago
parent 2bfd171a24
commit 051c4a45fd
  1. 7
      src/Php/Parser/AssignOpTrait.php
  2. 32
      tests/aot/arrays/list-nested.phpt

@ -109,6 +109,12 @@ trait AssignOpTrait
continue;
}
if ($item instanceof ArrayItem) {
if ($item->value instanceof Expr\List_) {
$nestedTmp = $this->genTmpVarName();
$this->addLocalVar($nestedTmp, self::TYPE_ARRAY);
$code .= "{$nestedTmp} = {$tmpVar}.item({$k}); ";
$code .= $this->parseAssignToList($item->value, new Variable($nestedTmp));
} else {
$oriInAssignExpr = $this->context->inAssignExpr;
$this->context->inAssignExpr = true;
$var = $this->parseIdentifier($item->value);
@ -117,6 +123,7 @@ trait AssignOpTrait
$this->addLocalVar($var, self::TYPE_VAR);
}
$code .= "{$var} = {$tmpVar}.item({$k}); ";
}
} else {
abort($item);
}

@ -0,0 +1,32 @@
--TEST--
nested list() destructuring
--FILE--
<?php
function main(): void {
$arr = [1, [2, 3], 4];
list($a, list($b, $c), $d) = $arr;
echo $a, PHP_EOL;
echo $b, PHP_EOL;
echo $c, PHP_EOL;
echo $d, PHP_EOL;
// deeper nesting
$arr2 = [10, [20, [30, 40]], 50];
list($x, list($y, list($z, $w)), $v) = $arr2;
echo $x, PHP_EOL;
echo $y, PHP_EOL;
echo $z, PHP_EOL;
echo $w, PHP_EOL;
echo $v, PHP_EOL;
}
?>
--EXPECT--
1
2
3
4
10
20
30
40
50
Loading…
Cancel
Save