feat(php): 支持 PHP 命名参数功能

- 实现命名参数解析和重排逻辑
- 添加函数定义参数信息获取功能
- 支持命名参数与位置参数混合使用
- 确保参数按正确顺序传递给原生函数
- 添加命名参数测试用例
- 提供命名参数使用示例
pull/1/head
韩天峰 6 months ago
parent aa6d81d2a7
commit 54c43dc691
  1. 10
      examples/named_args.php
  2. 37
      src/Php/CompilerBase.php
  3. 18
      tests/aot/named-args.phpt

@ -0,0 +1,10 @@
<?php
function foo($a, $b, $c): void
{
var_dump($a, $b, $c);
}
function main(): void
{
foo(c: 3, a: 1, b: 2);
}

@ -1959,13 +1959,32 @@ class CompilerBase extends \PhpAot\Core\Translator
return $call . '(' . $fn . ', {' . $this->parseCallArgs($expr->args, $name) . '})'; return $call . '(' . $fn . ', {' . $this->parseCallArgs($expr->args, $name) . '})';
} }
protected function parseNativeCallArgs(array $args, string $nativeFunc): string protected function parseNativeCallArgs(array $callArgs, string $nativeFunc): string
{ {
$list_args = []; $argList = [];
foreach ($args as $i => $arg) { $functionDef = $this->functions[$nativeFunc];
if ($arg->name !== null) { $args = [];
$this->fatalError($arg, 'Named arguments are not supported'); $hasNamedArg = false;
// 对命名参数进行重排
foreach ($callArgs as $i => $arg) {
if ($arg->name) {
foreach($functionDef->argInfoList as $k => $argInfo) {
if ($argInfo->name === $arg->name->name) {
$args[$k] = $arg;
$hasNamedArg = true;
break;
}
} }
} else {
$args[$i] = $arg;
}
}
// 对 key 进行排序,确保参数顺序正确
if ($hasNamedArg) {
ksort($args);
}
foreach ($args as $i => $arg) {
$argInfo = $this->getArgInfo($arg, $nativeFunc, $i); $argInfo = $this->getArgInfo($arg, $nativeFunc, $i);
if ($argInfo->variadic) { if ($argInfo->variadic) {
$vargs = array_slice($args, $i); $vargs = array_slice($args, $i);
@ -1973,14 +1992,14 @@ class CompilerBase extends \PhpAot\Core\Translator
foreach ($vargs as $varg) { foreach ($vargs as $varg) {
$list_vargs[] = $this->getTypeConvertedArg($varg, $argInfo); $list_vargs[] = $this->getTypeConvertedArg($varg, $argInfo);
} }
$list_args[] = '{' . implode(', ', $list_vargs) . '}'; $argList[] = '{' . implode(', ', $list_vargs) . '}';
break; break;
} else { } else {
$list_args[] = $this->getTypeConvertedArg($arg, $argInfo); $argList[] = $this->getTypeConvertedArg($arg, $argInfo);
} }
} }
return implode(', ', $list_args); return implode(', ', $argList);
} }
protected function parseCallArgs(array $args, string $funcName = '', string $className = ''): string protected function parseCallArgs(array $args, string $funcName = '', string $className = ''): string

@ -0,0 +1,18 @@
--TEST--
named args
--FILE--
<?php
function foo($a, $b, $c): void
{
var_dump($a, $b, $c);
}
function main(): void
{
foo(c: 3, a: 1, b: 2);
}
?>
--EXPECT--
int(1)
int(2)
int(3)
Loading…
Cancel
Save