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
{
$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;
$next = $right;
while ($next->getType() === 'Expr_Assign') {
$var = $next->var;
$checkVarFn($var);
$chain[] = $var;
$next = $next->expr;
}
$tmpVar = $this->genTmpVarName();
$this->addLocalVar($tmpVar, self::TYPE_VAR);
@ -1041,9 +1027,10 @@ class CompilerBase extends \PhpAot\Core\Translator
return $code . '}';
}
$oriInAssignExpr = $this->inAssignExpr;
$this->inAssignExpr = true;
$var = $this->parseIdentifier($left);
$this->inAssignExpr = false;
$this->inAssignExpr = $oriInAssignExpr;
if ($var === 'this_') {
$this->fatalError($left, 'Cannot re-assign $this');
}
@ -1677,7 +1664,11 @@ class CompilerBase extends \PhpAot\Core\Translator
$var = $this->parseIdentifier($node->var);
if ($this->isVarExpr($node->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 ($node->dim === null) {

Loading…
Cancel
Save