From 9526f9992b284721d119c7819acbda13f747638e Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Tue, 17 Mar 2026 19:31:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(closure):=20=E5=AE=8C=E5=96=84=E9=97=AD?= =?UTF-8?q?=E5=8C=85=20use=20=E8=AF=AD=E6=B3=95=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加对非变量表达式的错误检查,只允许变量名 - 实现闭包 use 引用类型的就地变量创建功能 - 在当前作用域中为引用变量设置正确的类型标识 - 改进普通变量的未定义变量错误检查逻辑 - 确保闭包 use 语法的类型安全性和变量可见性 --- src/Php/Generator/ClosureGenerator.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/Php/Generator/ClosureGenerator.php b/src/Php/Generator/ClosureGenerator.php index a77afa90..ec14f020 100644 --- a/src/Php/Generator/ClosureGenerator.php +++ b/src/Php/Generator/ClosureGenerator.php @@ -86,12 +86,25 @@ trait ClosureGenerator if ($uses) { foreach ($uses as $useItem) { $var = $this->parseIdentifier($useItem->var); - if ($this->isVarExpr($useItem->var) and !$this->hasVar($var)) { - $this->errorUndefinedVariable($useItem->var); + if (!$this->isVarExpr($useItem->var)) { + $this->fatalError($useItem->var, 'Incorrect Closure use syntax, only variable names are allowed'); } if ($useItem->byRef) { + // 闭包的 use 语法,若为引用类型,可以就地创建变量 + if ($useCurrentScope) { + if (!isset($oriLocalVars[$var])) { + $oriLocalVars[$var] = self::TYPE_REF; + } + } else { + if (!$this->hasVar($var)) { + $this->addLocalVar($var, self::TYPE_REF); + } + } $useVars[] = $this->convertToRef($useItem->var); } else { + if (!$this->hasVar($var)) { + $this->errorUndefinedVariable($useItem->var); + } $useVars[] = $var; } }