refactor(php): 优化类名解析逻辑并添加objval函数支持

- 提取类名参数解析逻辑到独立的resolveClassNameArg方法
- 简化toObject方法中的类名解析实现
- 添加对objval函数调用的类名解析支持
- 在polyfills中定义objval函数以支持新的解析逻辑
pull/1/head
韩天峰 3 months ago
parent 26a538680f
commit 215c077291
  1. 29
      src/Php/CompilerBase.php
  2. 5
      src/polyfills.php

@ -2073,18 +2073,16 @@ class CompilerBase extends \PhpAot\Core\Translator
$attr = $expr->getAttribute('stdContainerDimFetch');
return $this->context->stdContainers[$attr['var']]['class'] ?? '';
}
if ($this->isFuncCallExpr($expr) and $this->isNameExpr($expr->name)) {
$fn = $this->parseIdentifier($expr->name);
if (count($expr->args) === 2 and $fn === 'objval') {
return $this->resolveClassNameArg($expr->args[1]->value);
}
}
if ($this->isMethodCall($expr) and $this->isNamedMethod($expr->name)) {
$method = $this->parseIdentifier($expr->name);
if ($method === 'toObject' and !empty($expr->args)) {
$argClass = $expr->args[0]->value;
if ($this->isScalarString($argClass)) {
return $this->getNamespacedClassName($argClass->value);
}
if ($this->isClassConstFetch($argClass)) {
if ($this->isNameExpr($argClass->class) and $this->isIdExpr($argClass->name) and $this->parseIdentifier($argClass->name) === 'class') {
return $this->getNamespacedClassName($this->parseIdentifier($argClass->class));
}
}
return $this->resolveClassNameArg($expr->args[0]->value);
}
if ($this->isVarExpr($expr->var)) {
$object = $this->parseVariable($expr->var);
@ -2114,6 +2112,19 @@ class CompilerBase extends \PhpAot\Core\Translator
return '';
}
protected function resolveClassNameArg(NodeAbstract $arg): string
{
if ($this->isScalarString($arg)) {
return $this->getNamespacedClassName($arg->value);
}
if ($this->isClassConstFetch($arg)) {
if ($this->isNameExpr($arg->class) and $this->isIdExpr($arg->name) and $this->parseIdentifier($arg->name) === 'class') {
return $this->getNamespacedClassName($this->parseIdentifier($arg->class));
}
}
return '';
}
protected function parseReturn(Node\Stmt\Return_ $v): string
{
if ($v->expr === null) {

@ -89,3 +89,8 @@ function any(mixed $var): mixed
return $var;
}
function objval(mixed $var, string $className): mixed
{
return $var;
}

Loading…
Cancel
Save