这可能吗? 不使用 Zend API,只使用 Native。 像在 PHP 扩展中一样使用它:
call_user_function(EG(function_table), NULL, &func, &retval, 1, params);
最佳答案
您很可能想要 vm_call_user_func().
Variant vm_call_user_func(const Variant& function, const Variant& params,
bool forwarding = false);
根据您的扩展程序在调用时执行的操作,您可能希望捕获函数可能抛出的异常。
try {
vm_call_user_func(function, params);
} catch (const Object&) {
try {
raise_warning("got exception in my extension");
} catch (const Object&) {
// exception in error handler!
}
}
vm_call_user_func
知道如何处理 PHP 定义可调用对象的各种方式(例如 "SomeClass::someMethod"
、array($obj, "method")
)。
根据调用函数的提供方式,可能会有更优化的方法。您可以要求用户必须提供一个闭包对象,而不是任意回调。由于闭包对象始终是可调用的(即您不必验证 SomeClass
是否存在于我的 "SomeClass::someMethod"
示例中),您可以提取底层对象,存储它而不是 Variant
和 vm_call_user_func()
将节省一些解码和验证它的开销。
关于php - 从 HHVM C++ 扩展运行 PHP 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43527822/