fix(php): 修复PHP编译器中的类型映射和常量处理问题

- 添加double类型到浮点数类型的映射
- 优化变量首次赋值时的类型确定逻辑,支持函数级作用域的变量处理
- 直接返回基本类型常量而不是通过getNativeType方法
- 添加内部常量的类型推断支持
- 简化布尔值和浮点数常量的类型返回逻辑
pull/1/head
韩天峰 3 months ago
parent 192bba3454
commit 619687d563
  1. 19
      src/Php/CompilerBase.php

@ -137,6 +137,7 @@ class CompilerBase extends \PhpAot\Core\Translator
protected array $zendTypeMap = [ protected array $zendTypeMap = [
'int' => self::TYPE_INT, 'int' => self::TYPE_INT,
'float' => self::TYPE_FLOAT, 'float' => self::TYPE_FLOAT,
'double' => self::TYPE_FLOAT,
'bool' => self::TYPE_BOOL, 'bool' => self::TYPE_BOOL,
'false' => self::TYPE_BOOL, 'false' => self::TYPE_BOOL,
'true' => 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}`"); $this->fatalError($left, "Cannot re-assign typed object `\${$var}` from `{$leftClass}` to `{$rightClass}`");
} }
} }
// 变量第一次被赋值,确定其类型,由于 PHP 的变量作用域是 function 级的,在 for/while 块中声明的变量,可以在块外使用
if (!$this->hasVar($var)) { if (!$this->hasVar($var)) {
$this->addLocalVar($var, $type); $this->addLocalVar($var, $this->isNativeType($type) ? $this->getNativeType($type) : $type);
} else { } else {
$this->checkVarAssignExpr($left, $this->getVarType($var), $type); $this->checkVarAssignExpr($left, $this->getVarType($var), $type);
} }
@ -2195,14 +2197,14 @@ class CompilerBase extends \PhpAot\Core\Translator
switch ($exprType) { switch ($exprType) {
case 'Expr_Cast_Int': case 'Expr_Cast_Int':
case 'Scalar_Int': case 'Scalar_Int':
return $this->getNativeType(self::TYPE_INT); return self::TYPE_INT;
case 'Expr_Cast_Float': case 'Expr_Cast_Float':
case 'Expr_Cast_Double': case 'Expr_Cast_Double':
case 'Scalar_Float': case 'Scalar_Float':
return $this->getNativeType(self::TYPE_FLOAT); return self::TYPE_FLOAT;
case 'Expr_Cast_Bool': case 'Expr_Cast_Bool':
case 'Scalar_Bool': case 'Scalar_Bool':
return $this->getNativeType(self::TYPE_BOOL); return self::TYPE_BOOL;
case 'Expr_Array': case 'Expr_Array':
case 'Expr_Cast_Array': case 'Expr_Cast_Array':
return self::TYPE_ARRAY; return self::TYPE_ARRAY;
@ -4334,14 +4336,17 @@ class CompilerBase extends \PhpAot\Core\Translator
if ($this->hasConstant($name)) { if ($this->hasConstant($name)) {
return $this->getConstantType($name); return $this->getConstantType($name);
} }
if ($this->isInternalConstant($name)) {
return $this->getTypeFromZendType(gettype($this->internalConstants[$name]));
}
if ($name === 'true') { if ($name === 'true') {
return $this->getNativeType(self::TYPE_BOOL); return self::TYPE_BOOL;
} }
if ($name === 'false') { if ($name === 'false') {
return $this->getNativeType(self::TYPE_BOOL); return self::TYPE_BOOL;
} }
if ($name === 'NAN' or $name === 'INF') { if ($name === 'NAN' or $name === 'INF') {
return $this->getNativeType(self::TYPE_FLOAT); return self::TYPE_FLOAT;
} }
return self::TYPE_VAR; return self::TYPE_VAR;
} }

Loading…
Cancel
Save