|
|
|
|
@ -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() |
|
|
|
|
|