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) . '})';
}
protected function parseNativeCallArgs(array $args, string $nativeFunc): string
{
$list_args = [];
foreach ($args as $i => $arg) {
if ($arg->name !== null) {
$this->fatalError($arg, 'Named arguments are not supported');
protected function parseNativeCallArgs(array $callArgs, string $nativeFunc): string
{
$argList = [];
$functionDef = $this->functions[$nativeFunc];
$args = [];
$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);
if ($argInfo->variadic) {
$vargs = array_slice($args, $i);
@ -1973,14 +1992,14 @@ class CompilerBase extends \PhpAot\Core\Translator
foreach ($vargs as $varg) {
$list_vargs[] = $this->getTypeConvertedArg($varg, $argInfo);
}
$list_args[] = '{' . implode(', ', $list_vargs) . '}';
$argList[] = '{' . implode(', ', $list_vargs) . '}';
break;
} 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

@ -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