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; }