假设我们有一个自定义 PHP 扩展,例如:
PHP_RSHUTDOWN_FUNCTION(myextension)
{
// How do I call myfunction() from here?
return SUCCESS;
}
PHP_FUNCTION(myfunction)
{
// Do something here
...
RETURN_NULL;
}
如何从 RSHUTDOWN 处理程序调用 myfunction()?
假设我们有一个自定义 PHP 扩展,例如:
PHP_RSHUTDOWN_FUNCTION(myextension)
{
// How do I call myfunction() from here?
return SUCCESS;
}
PHP_FUNCTION(myfunction)
{
// Do something here
...
RETURN_NULL;
}
如何从 RSHUTDOWN 处理程序调用 myfunction()?
使用提供的宏调用将是:
PHP_RSHUTDOWN_FUNCTION(myextension)
{
ZEND_FN(myFunction)(0, NULL, NULL, NULL, 0 TSRMLS_CC);
return SUCCESS;
}
当您定义您作为PHP_FUNCTION(myFunction)
预处理器的功能时,您的定义将扩展为:
ZEND_FN(myFunction)(INTERNAL_FUNCTION_PARAMETERS)
这又是:
zif_myFunction(int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC)
来自 zend.h 和 php.h 的宏:
#define PHP_FUNCTION ZEND_FUNCTION
#define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))
#define ZEND_FN(name) zif_##name
#define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)
#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC
#define INTERNAL_FUNCTION_PARAM_PASSTHRU ht, return_value, return_value_ptr, this_ptr, return_value_used TSRMLS_CC
你为什么不把 PHP_FUNCTION 变成这样的存根:
void doStuff()
{
// Do something here
...
}
PHP_RSHUTDOWN_FUNCTION(myextension)
{
doStuff();
return SUCCESS;
}
PHP_FUNCTION(myfunction)
{
doStuff();
RETURN_NULL;
}