From 981a8613b5e8b6a8a08a93fa3325b2fff520e47b Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Fri, 5 Jun 2026 16:09:15 +0800 Subject: [PATCH] =?UTF-8?q?fix(generator):=20=E4=BF=AE=E5=A4=8D=E5=8F=AA?= =?UTF-8?q?=E8=AF=BB=E5=B1=9E=E6=80=A7=E7=9A=84=E9=BB=98=E8=AE=A4=E5=80=BC?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在生成 PHP stub 时为只读属性使用 ZVAL_UNDEF 初始化 - 防止对只读属性进行类型默认值初始化 - 添加空指针检查以避免访问可能不存在的变量名称 --- src/Php/Analysis/SsaBuilder.php | 4 ++-- src/gen_stub.php | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Php/Analysis/SsaBuilder.php b/src/Php/Analysis/SsaBuilder.php index ee7ef2a7..7e50cf7d 100644 --- a/src/Php/Analysis/SsaBuilder.php +++ b/src/Php/Analysis/SsaBuilder.php @@ -984,7 +984,7 @@ class SsaBuilder $defs[] = $stmt->valueVar->name; } } elseif ($stmt instanceof Stmt\Catch_) { - if (is_string($stmt->var->name)) { + if ($stmt->var && is_string($stmt->var->name)) { $defs[] = $stmt->var->name; } } @@ -1223,7 +1223,7 @@ class SsaBuilder // Handle catch variables if ($stmt instanceof Stmt\Catch_) { - if (is_string($stmt->var->name)) { + if ($stmt->var && is_string($stmt->var->name)) { $varName = $stmt->var->name; $ssaId = $this->allocateSsaId(); $ssaVar = new SsaVar($ssaId, $varName, 0); diff --git a/src/gen_stub.php b/src/gen_stub.php index 06dffb0e..5aaaa0cd 100755 --- a/src/gen_stub.php +++ b/src/gen_stub.php @@ -3258,7 +3258,11 @@ class PropertyInfo extends VariableLike $zvalName = "property_{$propertyName}_default_value"; if ($this->defaultValue === null && $this->type !== null) { $code .= "\tzval $zvalName;\n"; - $code .= $this->getTypeDefaultValueCode($zvalName); + if ($this->flags & Modifiers::READONLY || $this->classFlags & Modifiers::READONLY) { + $code .= "\tZVAL_UNDEF(&$zvalName);\n"; + } else { + $code .= $this->getTypeDefaultValueCode($zvalName); + } } else { $code .= $defaultValue->initializeZval($zvalName, varName: $this->name->__toString()); }