refactor(php): 优化编译器中的赋值表达式处理逻辑

- 移除重复的变量检查函数,简化右关联赋值解析
- 重构赋值表达式中的临时变量生成逻辑
- 改进数组维度获取的变量验证流程
- 修复变量作用域管理中的状态恢复问题
- 优化未定义变量错误处理与本地变量添加逻辑
pull/1/head
韩天峰 7 months ago
parent 3c63ff2cfd
commit 4ce8c24765
  1. 23
      src/Php/CompilerBase.php

@ -953,27 +953,13 @@ class CompilerBase extends \PhpAot\Core\Translator
protected function parseRightAssociativeAssign(NodeAbstract $left, Node\Expr\Assign $right): string protected function parseRightAssociativeAssign(NodeAbstract $left, Node\Expr\Assign $right): string
{ {
$checkVarFn = function ($var) {
if ($this->isArrayDimFetch($var)) {
$array = $this->parseIdentifier($var->var);
if ($this->isVarExpr($var->var)) {
if (!$this->hasVar($array)) {
$this->addLocalVar($array, self::TYPE_ARRAY);
}
}
}
};
$checkVarFn($left);
$chain[] = $left; $chain[] = $left;
$next = $right; $next = $right;
while ($next->getType() === 'Expr_Assign') { while ($next->getType() === 'Expr_Assign') {
$var = $next->var; $var = $next->var;
$checkVarFn($var);
$chain[] = $var; $chain[] = $var;
$next = $next->expr; $next = $next->expr;
} }
$tmpVar = $this->genTmpVarName(); $tmpVar = $this->genTmpVarName();
$this->addLocalVar($tmpVar, self::TYPE_VAR); $this->addLocalVar($tmpVar, self::TYPE_VAR);
@ -1041,9 +1027,10 @@ class CompilerBase extends \PhpAot\Core\Translator
return $code . '}'; return $code . '}';
} }
$oriInAssignExpr = $this->inAssignExpr;
$this->inAssignExpr = true; $this->inAssignExpr = true;
$var = $this->parseIdentifier($left); $var = $this->parseIdentifier($left);
$this->inAssignExpr = false; $this->inAssignExpr = $oriInAssignExpr;
if ($var === 'this_') { if ($var === 'this_') {
$this->fatalError($left, 'Cannot re-assign $this'); $this->fatalError($left, 'Cannot re-assign $this');
} }
@ -1677,7 +1664,11 @@ class CompilerBase extends \PhpAot\Core\Translator
$var = $this->parseIdentifier($node->var); $var = $this->parseIdentifier($node->var);
if ($this->isVarExpr($node->var)) { if ($this->isVarExpr($node->var)) {
if (!$this->hasVar($var)) { if (!$this->hasVar($var)) {
$this->fatalError($node->var, "The variable `{$node->var->name}` is undefined"); if ($write) {
$this->addLocalVar($var, self::TYPE_ARRAY);
} else {
$this->fatalError($node->var, "The variable `{$node->var->name}` is undefined");
}
} }
if ($var === 'GLOBALS') { if ($var === 'GLOBALS') {
if ($node->dim === null) { if ($node->dim === null) {

Loading…
Cancel
Save