test(array): 添加数组合并展开操作的测试用例

- 新增 array-merge-unpack.phpt 测试文件
- 实现 Dg 类用于测试数组合并展开功能
- 添加 f1 方法测试 array_merge(...array_map('array_values', $this->r))
- 添加 f2 方法测试双重 foreach 循环展开
- 实现 chk 方法验证两种方法的结果一致性
- 添加 main 函数执行测试用例

fix(optimizer): 修复函数调用优化器对命名参数和展开参数的处理

- 在 dispatchFuncCall 方法中添加参数检查逻辑
- 检测到命名参数或 unpack 展开参数时返回 false
- 避免静态优化路径处理需要运行时解析的参数
- 确保命名参数和展开语法正确回退到动态调用
pull/3/head
韩天峰 2 months ago
parent e55da7297d
commit b8247d4cc7
  1. 7
      src/Php/Optimizer/FuncCallOptimizer.php
  2. 69
      tests/aot/array/array-merge-unpack.phpt
  3. 0
      tests/aot/array/list-nested.phpt

@ -225,6 +225,13 @@ trait FuncCallOptimizer
protected function dispatchFuncCall(string $name, Node\Expr\FuncCall $expr, array $config): string|false
{
// 命名参数 / unpack(...)展开需要运行时处理,回退到动态调用路径
foreach ($expr->args as $arg) {
if ($arg->name !== null || $arg->unpack) {
return false;
}
}
$target = $config['target'] ?? null;
if ($target === null) {
$target = 'php::fn::' . $name;

@ -0,0 +1,69 @@
--TEST--
array merge unpack
--FILE--
<?php
class Dg {
private int $c;
private array $r;
public function __construct(int $c = 3) {
$this->c = $c;
$this->r = [];
}
public function g(): self {
for ($i = 0; $i < $this->c; $i++) {
$this->r[] = [
'bid' => time(),
'ct' => 1,
'cid' => random_int(1e8, 2147483647),
'cp' => strtoupper(substr(bin2hex(random_bytes(8)), 0, 12)),
'crt' => date('Y-m-d H:i:s'),
'mem' => '',
];
}
return $this;
}
//array_merge
public function f1(): array {
return array_merge(...array_map('array_values', $this->r));
}
//双重 foreach
public function f2(): array {
$res = [];
foreach ($this->r as $row) {
foreach ($row as $v) {
$res[] = $v;
}
}
return $res;
}
public function chk(): void {
$exp = $this->c * count($this->r[0]);
$spr = count($this->f1());
$loo = count($this->f2());
echo "Rows: {$this->c}\n";
echo "Cols: " . count($this->r[0]) . "\n";
echo "Exp : {$exp}\n";
echo "Spr : {$spr}\n";
echo "Loo : {$loo}\n\n";
echo ($spr === $exp && $loo === $exp) ? "PASS" : "FAIL";
echo "\n\n";
}
}
function main(): void
{
(new Dg(3))->g()->chk();
}
?>
--EXPECT--
Rows: 3
Cols: 6
Exp : 18
Spr : 18
Loo : 18
PASS
Loading…
Cancel
Save