From ef840ff9152cc07cfbb34a9c0456c70e7daad57e Mon Sep 17 00:00:00 2001 From: NathanFreeman <1056159381@qq.com> Date: Sat, 1 Aug 2026 21:56:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B3=A8=E9=87=8A=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Translator.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Translator.php b/src/Translator.php index 103c62e5..b7f6c24a 100644 --- a/src/Translator.php +++ b/src/Translator.php @@ -3177,6 +3177,15 @@ CODE; $cppCode .= $this->genWrapperRequiredArgCountCheck($functionDef, $displayName); } + /** + * 若当前文件声明了 declare(strict_types=1);,则需为当前函数标记 ZEND_ACC_STRICT_TYPES 标志。 + * 该标志用于确保函数在通过 ZendVM 调用其他函数时,能够严格按照声明模式校验参数类型。 + * 需要注意的是,此机制仅作用于 ZendVM 动态调用的函数, + * 若目标函数为编译后的本地代码,则不会触发类型检查——这是 ZendVM 的设计使然,其哲学是信任已编译内部函数的 C 代码实现。 + * + * 类型检查仅在二进制模式下启用。由于二进制模式作为独立可执行程序运行,需保持和直接运行的PHP代码一致的行为语义,因此必须保留类型检查以确保安全性。 + * 相反,当编译为扩展(如 ext/curl)时,编译端无需强制内置类型检查,其开启与否应由调用方PHP代码自行决定。 + */ $cppCode .= $this->genDeclareStrictTypesCode(); foreach ($functionDef->argInfoList as $k => $argInfo) { @@ -4892,15 +4901,6 @@ CODE; return $code; } - /** - * 若当前文件声明了 declare(strict_types=1);,则需为当前函数标记 ZEND_ACC_STRICT_TYPES 标志。 - * 该标志用于确保函数在通过 ZendVM 调用其他函数时,能够严格按照声明模式校验参数类型。 - * 需要注意的是,此机制仅作用于 ZendVM 动态调用的函数, - * 若目标函数为编译后的本地代码,则不会触发类型检查——这是 ZendVM 的设计使然,其哲学是信任已编译内部函数的 C 代码实现。 - * - * 类型检查仅在二进制模式下启用。由于二进制模式作为独立可执行程序运行,需保持和直接运行的PHP代码一致的行为语义,因此必须保留类型检查以确保安全性。 - * 相反,当编译为扩展(如 ext/curl)时,编译端无需强制内置类型检查,其开启与否应由调用方PHP代码自行决定。 - */ private function genDeclareStrictTypesCode(): string { return $this->declareStrictTypes && $this->isBuildModeBin()