API 参考

March 27, 2026 · View on GitHub

本文档提供 PHPX 的完整 API 参考。

目录


核心类型

Variant

通用变量类型,可以存储任何 PHP 值。

构造函数

// 默认构造(空值)
Variant();

// 从整数构造
Variant(Int value);
Variant(int64_t value);

// 从浮点数构造
Variant(Float value);
Variant(double value);

// 从布尔值构造
Variant(bool value);

// 从字符串构造
Variant(const char *value);
Variant(const std::string &value);
Variant(zend_string *value);

// 从数组构造
Variant(const Array &value);

// 从对象构造
Variant(const Object &value);

// 从 zval 构造
Variant(zval *v, Ctor ctor);
Variant(const zval *v, Ctor ctor);

// 拷贝构造
Variant(const Variant &other);

类型转换方法

// 转换为整数
Int toInt() const;
int64_t toInt64() const;

// 转换为浮点数
Float toFloat() const;
double toDouble() const;

// 转换为字符串
String toString() const;
std::string toStdString() const;
const char *toCString() const;
zend_string *toStringValue() const;

// 转换为数组
Array toArray() const;

// 转换为对象
Object toObject() const;
Object toObject(const String &className) const;

// 转换为布尔值
Bool toBool() const;

// 转换为引用
Reference toReference();

类型检查方法

// 基本类型检查
bool isNull() const;
bool isBool() const;
bool isTrue() const;
bool isFalse() const;
bool isInt() const;
bool isFloat() const;
bool isDouble() const;
bool isString() const;
bool isArray() const;
bool isObject() const;
bool isResource() const;
bool isReference() const;

// 特殊类型检查
bool isIndirect() const;
bool isCallable() const;
bool isIterable() const;
bool isScalar() const;
bool isEmpty() const;

// 数值检查
bool isNumeric() const;
bool isNaN() const;
bool isInf() const;

操作符重载

// 赋值操作符
Variant &operator=(const Variant &other);
Variant &operator=(const zval *v);
Variant &operator=(zval *v);
Variant &operator=(Variant *v);

// 算术操作符
Variant operator+(const Variant &other) const;
Variant operator-(const Variant &other) const;
Variant operator*(const Variant &other) const;
Variant operator/(const Variant &other) const;
Variant operator%(const Variant &other) const;
Variant operator-() const;  // 负号

// 复合赋值操作符
Variant &operator+=(const Variant &other);
Variant &operator-=(const Variant &other);
Variant &operator*=(const Variant &other);
Variant &operator/=(const Variant &other);
Variant &operator%=(const Variant &other);

// 比较操作符
bool operator==(const Variant &other) const;
bool operator!=(const Variant &other) const;
bool operator<(const Variant &other) const;
bool operator<=(const Variant &other) const;
bool operator>(const Variant &other) const;
bool operator>=(const Variant &other) const;

// 数组访问操作符
Variant operator[](const Variant &offset) const;
Reference operator[](const Variant &offset);

其他方法

// 获取长度
size_t length() const;

// 获取引用计数
int getRefCount() const;

// 销毁变量
void unset();

// 调试输出
void debug();
void print() const;

// 获取底层 zval
zval *ptr();
const zval *ptr() const;
const zval *const_ptr() const;
zval *unwrap_ptr() const;

使用示例

// 创建变量
Variant v1;              // null
Variant v2 = 42;         // integer
Variant v3 = 3.14;       // float
Variant v4 = "hello";    // string
Variant v5 = true;       // boolean

// 类型检查
if (v2.isInt()) {
    echo("Integer: %ld\n", v2.toInt());
}

// 类型转换
String str = v4.toString();
Int num = v2.toInt();

// 算术运算
Variant result = v2 + 10;  // 52

// 比较
if (v2 == 42) {
    echo("Answer to life\n");
}

Array

PHP 数组的 C++ 封装。

构造函数

// 默认构造(空数组)
Array();

// 指定初始大小
Array(size_t size);

// 从 Variant 构造
Array(const Variant &value);

// 从 zend_array 构造
Array(zend_array *arr, Ctor ctor);
Array(const zend_array *arr, Ctor ctor);

元素访问

// 获取元素
Variant offsetGet(const Variant &offset);
Variant operator[](const Variant &offset);
const Variant operator[](const Variant &offset) const;

// 设置元素
void offsetSet(const Variant &offset, const Variant &value);
void operator[](const Variant &offset) = const Variant &value;

// 检查元素是否存在
bool offsetExists(const Variant &offset);
bool exists(const Variant &offset) const;

// 删除元素
void offsetUnset(const Variant &offset);

数组操作

// 获取数组大小
size_t count() const;
size_t length() const;

// 合并数组
Array merge(const Array &other) const;

// 追加元素
void append(const Variant &value);
void push(const Variant &value);

// 弹出元素
Variant pop();
Variant shift();

// 获取键名
Array keys() const;

// 获取值
Array values() const;

// 反转数组
Array reverse() const;

// 切片
Array slice(long offset, long length = 0) const;

遍历

// 使用 foreach
void foreach(std::function<void(Variant &key, Variant &value)> func);

// 获取迭代器
zend_array_iterator *getIterator() const;

其他方法

// 获取底层 zend_array
zend_array *ptr();
const zend_array *ptr() const;

// 增加引用计数
void addRef();

// 减少引用计数
void release();

// 分离数组(写时复制)
void separate();

// 是否为空
bool isEmpty() const;

// 排序
void sort();
void rsort();
void ksort();
void asort();

使用示例

// 创建数组
Array arr;
arr.set("name", "John");
arr.set("age", 25);
arr.append("item1");
arr.append("item2");

// 访问元素
Variant name = arr["name"];
Variant age = arr.offsetGet("age");

// 修改元素
arr["age"] = 26;

// 遍历
arr.foreach([](Variant &key, Variant &value) {
    echo("%s: ", key.toString().data());
    value.print();
});

// 数组合并
Array arr2;
arr2.set("city", "Beijing");
Array merged = arr.merge(arr2);

// 切片
Array sliced = arr.slice(1, 2);

Object

PHP 对象的 C++ 封装。

构造函数

// 默认构造
Object();

// 从 Variant 构造
Object(const Variant &value);

// 从 zend_object 构造
Object(zend_object *obj, Ctor ctor);
Object(const zend_object *obj, Ctor ctor);

静态方法

// 创建新对象
static Object newObject(const String &className, Args args = {});
static Object newObject(zend_class_entry *ce, Args args = {});

// 获取类入口
static zend_class_entry *getClassEntry(const String &className);

属性访问

// 获取属性
Variant getProperty(const String &name);
Variant operator[](const String &name);

// 设置属性
void setProperty(const String &name, const Variant &value);
void operator[](const String &name) = const Variant &value;

// 检查属性是否存在
bool hasProperty(const String &name) const;
bool propertyExists(const String &name) const;

// 删除属性
void unsetProperty(const String &name);

// 获取静态属性
static Variant getStaticProperty(const String &className, const String &prop);
static Variant getStaticProperty(zend_class_entry *ce, uint32_t offset);
static bool setStaticProperty(const String &className, const String &prop, const Variant &value);

方法调用

// 调用实例方法
Variant call(const String &method, Args args = {});
Variant call(const String &method, const ArgList &args);

// 调用静态方法
static Variant callStatic(const String &className, const String &method, Args args = {});
Variant callStatic(const String &method, Args args = {});

// 调用魔术方法
Variant __call(const String &method, Args args);

类信息

// 获取类名
String getClassName() const;

// 获取类入口
zend_class_entry *getClassEntry() const;

// 检查是否是类的实例
bool instanceOf(const String &className) const;
bool instanceof(zend_class_entry *ce) const;

// 获取父类
Object getParentClass() const;

// 获取接口
Array getInterfaceNames() const;

其他方法

// 获取引用计数
int getRefCount() const;

// 获取句柄
zend_object_handle getHandle() const;

// 克隆对象
Object clone() const;

// 获取底层对象
zend_object *ptr();
const zend_object *ptr() const;

使用示例

// 创建对象
Object date = newObject("DateTime", {"2026-03-27"});

// 设置属性
date.setProperty("timezone", "Asia/Shanghai");

// 获取属性
Variant tz = date.getProperty("timezone");

// 调用方法
Variant formatted = date.call("format", {"Y-m-d H:i:s"});

// 检查类型
if (date.instanceOf("DateTime")) {
    echo("Is DateTime\n");
}

// 调用静态方法
Variant staticResult = Object::callStatic("DateTime", "createFromFormat", {"Y-m-d", "2026-03-27"});

String

PHP 字符串的 C++ 封装。

构造函数

// 默认构造(空字符串)
String();

// 从 C 字符串构造
String(const char *s);
String(const char *s, size_t len);

// 从 std::string 构造
String(const std::string &s);

// 从 zend_string 构造
String(zend_string *str, Ctor ctor);

访问方法

// 获取数据
const char *data() const;
char *data();

// 获取长度
size_t length() const;

// 转换为 C 字符串
const char *c_str() const;

// 转换为 std::string
std::string toStdString() const;

// 转换为 zend_string
zend_string *toStringValue() const;

字符串操作

// 连接
String concat(const String &other) const;
String operator+(const String &other) const;

// 子串
String substr(size_t start, size_t length = -1) const;

// 查找位置
Int strpos(const String &needle, size_t offset = 0) const;
Int stripos(const String &needle, size_t offset = 0) const;

// 替换
String replace(const String &search, const String &replace) const;

// 大小写转换
String strtoupper() const;
String strtolower() const;
String ucfirst() const;
String ucwords() const;

// 修剪
String trim() const;
String ltrim() const;
String rtrim() const;
String trim(const String &character_mask) const;

类型转换

// 转换为数值
Int toInt() const;
Float toFloat() const;
Double toDouble() const;

// 数值格式化
String numberFormat(int decimals = 0, 
                   const String &dec_point = ".", 
                   const String &thousands_sep = ",") const;

其他方法

// 重复字符串
String repeat(size_t multiplier) const;

// 反转字符串
String strrev() const;

// 填充字符串
String pad(int len, const String &pad_string = " ", int pad_type = STR_PAD_RIGHT) const;

// 分割数组
Array explode(const String &delimiter) const;

// 获取字符
String chr(size_t index) const;
Int ord(size_t index = 0) const;

使用示例

// 创建字符串
String str = "Hello World";

// 字符串操作
String upper = str.strtoupper();  // "HELLO WORLD"
String lower = str.strtolower();  // "hello world"
String sub = str.substr(0, 5);    // "Hello"

// 查找
Int pos = str.strpos("World");    // 6

// 替换
String replaced = str.replace("World", "PHPX");  // "Hello PHPX"

// 连接
String greeting = str + " from PHPX!";

// 分割
Array parts = str.explode(" ");  // ["Hello", "World"]

Reference

PHP 引用的封装。

构造函数

// 从 Variant 构造
Reference(const Variant &value);

// 从 zval 构造
Reference(zval *value);

方法

// 获取引用值
Variant getValue() const;

// 设置引用值
void setValue(const Variant &value);

// 获取底层 zval
zval *ptr();
const zval *ptr() const;

// 转换为 Variant
operator Variant() const;

使用示例

// 创建引用
Variant var = 100;
Reference ref = var.toReference();

// 修改引用值
ref.setValue(200);
echo(var.toInt());  // 输出 200

// 通过引用传递
function test(Reference param) {
    param.setValue(param.getValue() + 1);
}

基础函数

输出函数

// 格式化输出
void echo(const char *format, ...);
void echo(const String &str);
void echo(const Variant &val);
void echo(Int val);
void echo(Float val);

// 打印变量
void var_dump(const Variant &var);
void print_r(const Variant &var);

全局变量

// 获取全局变量
Variant global(const String &name);

// 初始化全局变量
void initGlobal(const String &name, Variant &var);

// 删除全局变量
void unsetGlobal(const String &name);

常量操作

// 获取常量
Variant constant(const String &name);
Variant constant(const String &cls, const String &name);
Variant constant(zend_class_entry *ce, const String &name);

// 定义常量
void define(const String &name, const Variant &value);

包含文件

// 包含文件
Variant include(const String &file, IncludeType type = INCLUDE);
Variant eval(const String &script);

// 包含类型
enum IncludeType {
    INCLUDE = ZEND_INCLUDE,
    INCLUDE_ONCE = ZEND_INCLUDE_ONCE,
    REQUIRE = ZEND_REQUIRE,
    REQUIRE_ONCE = ZEND_REQUIRE_ONCE,
};

函数调用

// 调用 PHP 函数
Variant call(const Variant &func, Args &args);
Variant call(const Variant &func, Array &args);
Variant call(const Variant &func, const ArgList &args);

// 调用 zend_function
Variant call(zend_function *func);
Variant call(zend_function *func, Args &_args);
Variant call(zend_function *func, Array &args);
Variant call(zend_function *func, const ArgList &args);

// 调用类方法
Variant call(zend_class_entry *ce, zend_function *func);
Variant call(zend_class_entry *ce, zend_function *func, const ArgList &args);

退出

// 退出程序
void exit(const Variant &status);

数组操作

创建数组

// 创建空数组
Array arr;

// 创建指定大小的数组
Array arr(10);

// 使用初始化列表
Array arr = {1, 2, 3, 4, 5};

添加元素

// 关联数组
arr.set("key", "value");
arr["name"] = "John";

// 索引数组
arr.append("item");
arr.push(100);

// 批量添加
arr.merge({{"a", 1}, {"b", 2}});

删除元素

// 删除指定元素
arr.offsetUnset("key");
arr.pop();
arr.shift();

数组排序

// 索引排序
arr.sort();   // 升序
arr.rsort();  // 降序

// 键名排序
arr.ksort();  // 按键名升序
arr.asort();  // 按值升序

数组切片

// 获取切片
Array sliced = arr.slice(0, 5);  // 前 5 个元素
Array last = arr.slice(-3);      // 最后 3 个元素

对象操作

创建对象

// 创建内置类对象
Object date = newObject("DateTime", {"2026-03-27"});
Object arrayObj = newObject("ArrayObject", {arr});

// 创建自定义类对象
Object myObj = newObject("MyClass", {param1, param2});

属性访问

// 读取属性
Variant value = obj.getProperty("name");
Variant value = obj["property"];

// 设置属性
obj.setProperty("name", "value");
obj["property"] = newValue;

// 检查属性
if (obj.hasProperty("name")) {
    // ...
}

方法调用

// 调用实例方法
Variant result = obj.call("methodName", {arg1, arg2});

// 调用静态方法
Variant result = Object::callStatic("ClassName", "staticMethod", {args});

字符串处理

字符串连接

String str1 = "Hello";
String str2 = "World";

// 使用 + 操作符
String result = str1 + " " + str2;

// 使用 concat 方法
String result = str1.concat(" ").concat(str2);

字符串查找

String str = "Hello World";

// 查找位置
Int pos = str.strpos("World");     // 6
Int pos = str.stripos("world");    // 6 (不区分大小写)

// 查找最后一次出现
Int pos = str.strrpos("o");        // 7

字符串修改

String str = "  Hello World  ";

// 修剪
String trimmed = str.trim();       // "Hello World"
String leftTrimmed = str.ltrim();  // "Hello World  "
String rightTrimmed = str.rtrim(); // "  Hello World"

// 大小写
String upper = str.strtoupper();   // "  HELLO WORLD  "
String lower = str.strtolower();   // "  hello world  "

// 首字母大写
String ucfirst_result = str.ucfirst();  // "  Hello World  "
String ucwords_result = str.ucwords();  // "  Hello World  "

字符串替换

String str = "Hello World";

// 简单替换
String replaced = str.replace("World", "PHPX");

// 子串
String sub = str.substr(0, 5);  // "Hello"

数学函数

基本运算

Variant a = 10;
Variant b = 3;

// 加减乘除
Variant sum = a + b;        // 13
Variant diff = a - b;       // 7
Variant prod = a * b;       // 30
Variant quot = a / b;       // 3.333...
Variant mod = a % b;        // 1

// 复合赋值
a += b;  // 13
a -= b;  // 7
a *= b;  // 30
a /= b;  // 3.333...

数学函数

// 绝对值
Variant abs = Variant(-10).abs();  // 10

// 取整
Variant rounded = Variant(3.7).round();  // 4
Variant floored = Variant(3.7).floor();  // 3
Variant ceiled = Variant(3.2).ceil();    // 4

// 幂运算
Variant pow = Variant(2).pow(3);  // 8
Variant sqrt = Variant(16).sqrt();// 4

// 三角函数
Variant sin_val = Variant(0).sin();  // 0
Variant cos_val = Variant(0).cos();  // 1
Variant tan_val = Variant(0).tan();  // 0

随机数

// 生成随机整数
Variant rand = random_int(1, 100);

// 生成随机浮点数
Variant rand_float = random_float(0.0, 1.0);

错误处理

抛出异常

// 抛出错误
throwError("Something went wrong");
throwError("Invalid parameter: %s", param);

// 抛出特定异常
throwException("RuntimeException", "Error message", error_code);
throwException("InvalidArgumentException", "Invalid argument");

捕获异常

try {
    // 可能抛出异常的代码
    riskyOperation();
} catch (zend_object *ex) {
    // 捕获异常
    Object e = catchException();
    echo(e.getProperty("message").toString());
    echo(e.getProperty("code").toInt());
}

条件抛出

// 如果已发生异常则抛出
throwErrorIfOccurred();

// 尝试执行,失败回退
try_call([]() {
    constant("NOT_EXISTS");
}, "Fallback value");

调试 API

变量调试

Variant var = getValue();

// 打印调试信息
var.debug();

// 使用 var_dump 格式
var.print();

引用计数

// 获取引用计数
int rc = var.getRefCount();

// 检查是否为引用
if (var.isReference()) {
    // 处理引用
}

调试模式

// 启用调试模式
enableDebugInfo(true);

// 跟踪位置
traceDebugInfo(__FILE__, __LINE__);

本文档最后更新:2026-03-27