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

- 实现 parseNamedCallArgs 方法处理命名参数解析
- 添加命名参数语法验证和错误提示机制
- 生成临时变量存储命名参数数组结构
- 集成命名参数到函数调用参数解析流程
- 创建测试用例验证命名参数功能正确性
- 添加动态调用场景下的命名参数支持
pull/1/head
韩天峰 5 months ago
parent 60298d9461
commit 932dc070d8
  1. 29
      src/Php/CompilerBase.php
  2. 10
      tests/aot/dynamic_call/functions.inc
  3. 36
      tests/aot/dynamic_call/named-args.phpt

@ -2543,6 +2543,33 @@ class CompilerBase extends \PhpAot\Core\Translator
return implode(', ', $argList);
}
protected function parseNamedCallArgs(array $args, int $firstIndex, array $listArgs): string
{
$namedArgs = [];
foreach ($args as $i => $arg) {
if ($i < $firstIndex) {
continue;
}
if ($arg->name === null) {
$this->fatalError($arg, 'Named argument must follow positional argument');
}
if (!$this->isIdExpr($arg->name)) {
$this->fatalError($arg, 'Named argument must be a string');
}
$namedArgs[$arg->name->name] = $this->parseArg($arg);
}
$tmpVar = $this->genTmpVarName();
$array = self::TYPE_ARRAY . ' ' . $tmpVar . ';';
foreach ($namedArgs as $k => $v) {
$array .= $tmpVar . '.set(' . $this->getLiteralString($k) . ', ' . $v . ');' . PHP_EOL;
}
$this->context->beforeStmtLines[] = $array;
return '{' . implode(', ', $listArgs) . '}, ' . $tmpVar . '.array()';
}
protected function parseCallArgs(array $args, string $funcName = '', string $className = ''): string
{
$list_args = [];
@ -2552,7 +2579,7 @@ class CompilerBase extends \PhpAot\Core\Translator
throw new PlaceHolder();
}
if ($arg->name !== null) {
$this->fatalError($arg, 'Named arguments are not supported');
return $this->parseNamedCallArgs($args, $i, $list_args);
}
$byRef = $funcName && Reflection::isReferenceArg($funcName, $className, $i);
if ($this->isVarExpr($arg->value)) {

@ -0,0 +1,10 @@
<?php
function createUser(
string $name,
int $age,
string $city = 'Beijing',
bool $vip = false
): array
{
return ['name' => $name, 'age' => $age, 'city' => $city, 'vip' => $vip];
}

@ -0,0 +1,36 @@
--TEST--
named args
--FILE--
<?php
function main()
{
include_once __DIR__.'/functions.inc';
$rs = createUser('John', 20);
var_dump($rs);
$name = 'Tom';
$rs = createUser($name, vip: true, age: 20);
var_dump($rs);
}
?>
--EXPECT--
array(4) {
["name"]=>
string(4) "John"
["age"]=>
int(20)
["city"]=>
string(7) "Beijing"
["vip"]=>
bool(false)
}
array(4) {
["name"]=>
string(3) "Tom"
["age"]=>
int(20)
["city"]=>
string(7) "Beijing"
["vip"]=>
bool(true)
}
Loading…
Cancel
Save