有可能吗? 不使用Zend API,只使用Native。 在PHP扩展中使用它:
call_user_function(EG(function_table), NULL, &func, &retval, 1, params);
答案 0 :(得分:1)
您最有可能想要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定义callables的各种方式(例如"SomeClass::someMethod"
,array($obj, "method")
)。
根据提供呼叫功能的方式,可能会有更多优化方式。您可以要求使用而不是任何任意回调,用户必须提供闭包对象。由于闭包对象始终是可调用的(即,您不必验证我的SomeClass
示例中存在"SomeClass::someMethod"
),您可以提取底层对象,而不是{{1 }和Variant
将节省一些开销解码并验证它。