所以我决定为php写一个扩展名。一切似乎都很好,除非我遇到一个小问题。
我有php-5.4.9
源代码。文件ext/standard/mail.c
具有很棒的功能
PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char *extra_cmd TSRMLS_DC)
在我的扩展程序中,acme.c
我有
...
#include "php.h"
#include "ext/standard/php_mail.h"
#include "php_ini.h"
...
所以php_mail
感觉很好并且工作正常。但是,显然,我想使用{101}中的代码从第101行开始到结束于189(http://pastie.org/5444192 5-93对应的行中的代码行)。所以我抓住了自己的想法(虽然在某些方面很尴尬)为什么不打电话给mail.c
?到目前为止我找不到那些宏,实际上我想知道实现这个想法的最佳方法。
我的内心工程师(新手)建议我使用call_user_function
PHP_FUNCTION(mail)
但我无法弄明白如何调用它。
问题!如何(ZEND_API int call_user_function(HashTable *function_table, zval **object_pp, zval *function_name, zval *retval_ptr, zend_uint param_count, zval *params[] TSRMLS_DC);
函数的示例非常欢迎)来调用由mail
定义的函数?
答案 0 :(得分:20)
找出函数如何工作的最简单方法是在lxr.php.net上搜索它。出现的第一个示例是在readline:http://lxr.php.net/xref/PHP_TRUNK/ext/readline/readline.c#474
mail
的用法类似。如果参数为zvals(to_zval
,from_zval
,msg_zval
),则调用非常简单:
zval *params = { to_zval, from_zval, msg_zval };
zend_uint param_count = 3;
zval *retval_ptr;
zval function_name;
INIT_ZVAL(function_name);
ZVAL_STRING(&function_name, "mail", 1);
if (call_user_function(
CG(function_table), NULL /* no object */, &function_name,
retval_ptr, param_count, params TSRMLS_CC
) == SUCCESS
) {
/* do something with retval_ptr here if you like */
}
/* don't forget to free the zvals */
zval_ptr_dtor(&retval_ptr);
zval_dtor(&function_name);
如果您没有将参数设为zvals,则可以使用MAKE_STD_ZVAL
和ZVAL_STRING
创建参数。