# AOT 编译器原生类型支持说明 ## ⚠️ 重要提示 **AOT 编译器目前仅支持 3 种原生类型(Native Types)**: 1. ✅ `std::int` - 原生整数类型 (zend_long, 8 字节) 2. ✅ `std::float` - 原生浮点类型 (double, 8 字节) 3. ✅ `std::bool` - 原生布尔类型 (bool, 1 字节) --- ## 🎯 objval 编译期函数 ### 使用场景 当从数组、函数返回值等来源获取对象时,变量会丢失类型上下文信息。此时需要使用 `objval()` 显式声明对象的类。 ### 基本语法 ```php new User(), 'product' => new Product(), ]; // ❌ 错误:类型丢失 $user = $data['user']; // AOT 无法推断类型 // ✅ 正确:使用 objval 声明类型 $user = objval($data['user'], 'User'); $product = objval($data['product'], 'Product'); ``` #### 场景二:函数返回对象 ```php create('user'), 'User'); $product = objval($factory->create('product'), 'Product'); ``` ### 注意事项 ⚠️ **必须使用字面量字符串**: ```php property, 'MyClass'); $obj = objval(get_object(), 'MyClass'); // ❌ 错误:非 variable 表达式 $obj = objval(new MyClass(), 'MyClass'); // 不需要 ``` ### 性能影响 - ✅ `objval()` 是**编译期函数** - ✅ 不会产生运行时开销 - ✅ 仅在编译阶段进行类型推断 - ✅ 生成的 C++ 代码与普通变量赋值相同 ### 与 std:: 类型的区别 | 特性 | std::int/float/bool | objval | |------|---------------------|--------| | **用途** | 数值/布尔类型优化 | 对象类型声明 | | **性能** | ⚡ 高性能(原生类型) | 🐢 标准(ZVAL) | | **内存** | 8B/1B | 指针(16B+) | | **时机** | 运行时优化 | 编译期推断 | | **语法** | `std::int(值)` | `objval(变量,'类名')` | ---## ❌ 不支持的类型 以下类型**不使用**原生类型,仍然使用 ZVAL: - ❌ `std::string` - 字符串使用 ZVAL (php::Str) - ❌ `std::array` - 数组使用 ZVAL (php::Array) - ❌ `std::object` - 对象使用 ZVAL (php::Object) - ❌ 其他所有类型 - 使用 ZVAL (php::Var) ## 类型映射表 | PHP 类型声明 | C++ 类型 | Zend 类型 | 内存 | 性能 | 状态 | |------------|---------|----------|------|------|------| | `int` | `php::Int` | `zend_long` | 8B | ⚡ 高性能 | ✅ 原生 | | `float` | `php::Float` | `double` | 8B | ⚡ 高性能 | ✅ 原生 | | `bool` | `php::Bool` | `bool` | 1B | ⚡ 高性能 | ✅ 原生 | | `string` | `php::Str` | `zend_string*` | 指针 | 🐢 标准 | ❌ ZVAL | | `array` | `php::Array` | `zval*` | 指针 | 🐢 标准 | ❌ ZVAL | | `object` | `php::Object` | `zend_object*` | 指针 | 🐢 标准 | ❌ ZVAL | | `mixed`/无声明 | `php::Var` | `zval` | 16B | 🐢 标准 | ❌ ZVAL | ## 声明方式对比 | 类型 | C++ 实现 | 声明方式 | 内存 | 性能 | 状态 | |------|---------|---------|------|------|------| | **int** | `php::Int` | `std::int(值)`
`function foo(int $x)` | 8B | ⚡ 高性能 | ✅ 原生 | | **float** | `php::Float` | `std::float(值)`
`function foo(float $x)` | 8B | ⚡ 高性能 | ✅ 原生 | | **bool** | `php::Bool` | `std::bool(值)`
`function foo(bool $x)` | 1B | ⚡ 高性能 | ✅ 原生 | | **string** | `php::Str` | 无
`function foo(string $x)` | 指针 | 🐢 标准 | ❌ ZVAL | | **array** | `php::Array` | 无
`function foo(array $x)` | 指针 | 🐢 标准 | ❌ ZVAL | | **object** | `php::Object` | 无
`function foo(object $x)` | 指针 | 🐢 标准 | ❌ ZVAL | | **mixed** | `php::Var` | 无
`function foo($x)` | 16B | 🐢 标准 | ❌ ZVAL | ## 性能差异 ### 原生类型(高性能) ```php function calculate(int $a, int $b): int { return $a + $b; // 使用原生类型,性能提升 100-300 倍 } ``` ### ZVAL 类型(标准性能) ```php function process(string $name, array $data) { // 使用 ZVAL,标准 PHP 性能 echo $name; print_r($data); } ``` ## 使用建议 ### ✅ 推荐使用原生类型的场景 - 数值密集计算 - 循环计数器 - 递归算法 - 性能关键路径 ### ⚠️ 使用 ZVAL 的场景 - 字符串处理 - 数组操作 - 对象操作 - 通用业务逻辑 --- **最后更新**: 2024 年 3 月 18 日 **适用版本**: PHP AOT Compiler v1.x