From 619687d56348067a1ad900ecc4d5e85650bf4959 Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Mon, 25 May 2026 14:51:18 +0800 Subject: [PATCH] =?UTF-8?q?fix(php):=20=E4=BF=AE=E5=A4=8DPHP=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E5=99=A8=E4=B8=AD=E7=9A=84=E7=B1=BB=E5=9E=8B=E6=98=A0?= =?UTF-8?q?=E5=B0=84=E5=92=8C=E5=B8=B8=E9=87=8F=E5=A4=84=E7=90=86=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加double类型到浮点数类型的映射 - 优化变量首次赋值时的类型确定逻辑,支持函数级作用域的变量处理 - 直接返回基本类型常量而不是通过getNativeType方法 - 添加内部常量的类型推断支持 - 简化布尔值和浮点数常量的类型返回逻辑 --- src/Php/CompilerBase.php | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/Php/CompilerBase.php b/src/Php/CompilerBase.php index 5094cde8..fe513ac9 100644 --- a/src/Php/CompilerBase.php +++ b/src/Php/CompilerBase.php @@ -137,6 +137,7 @@ class CompilerBase extends \PhpAot\Core\Translator protected array $zendTypeMap = [ 'int' => self::TYPE_INT, 'float' => self::TYPE_FLOAT, + 'double' => self::TYPE_FLOAT, 'bool' => self::TYPE_BOOL, 'false' => self::TYPE_BOOL, 'true' => self::TYPE_BOOL, @@ -1616,8 +1617,9 @@ class CompilerBase extends \PhpAot\Core\Translator $this->fatalError($left, "Cannot re-assign typed object `\${$var}` from `{$leftClass}` to `{$rightClass}`"); } } + // 变量第一次被赋值,确定其类型,由于 PHP 的变量作用域是 function 级的,在 for/while 块中声明的变量,可以在块外使用 if (!$this->hasVar($var)) { - $this->addLocalVar($var, $type); + $this->addLocalVar($var, $this->isNativeType($type) ? $this->getNativeType($type) : $type); } else { $this->checkVarAssignExpr($left, $this->getVarType($var), $type); } @@ -2195,14 +2197,14 @@ class CompilerBase extends \PhpAot\Core\Translator switch ($exprType) { case 'Expr_Cast_Int': case 'Scalar_Int': - return $this->getNativeType(self::TYPE_INT); + return self::TYPE_INT; case 'Expr_Cast_Float': case 'Expr_Cast_Double': case 'Scalar_Float': - return $this->getNativeType(self::TYPE_FLOAT); + return self::TYPE_FLOAT; case 'Expr_Cast_Bool': case 'Scalar_Bool': - return $this->getNativeType(self::TYPE_BOOL); + return self::TYPE_BOOL; case 'Expr_Array': case 'Expr_Cast_Array': return self::TYPE_ARRAY; @@ -4334,14 +4336,17 @@ class CompilerBase extends \PhpAot\Core\Translator if ($this->hasConstant($name)) { return $this->getConstantType($name); } + if ($this->isInternalConstant($name)) { + return $this->getTypeFromZendType(gettype($this->internalConstants[$name])); + } if ($name === 'true') { - return $this->getNativeType(self::TYPE_BOOL); + return self::TYPE_BOOL; } if ($name === 'false') { - return $this->getNativeType(self::TYPE_BOOL); + return self::TYPE_BOOL; } if ($name === 'NAN' or $name === 'INF') { - return $this->getNativeType(self::TYPE_FLOAT); + return self::TYPE_FLOAT; } return self::TYPE_VAR; }