菲律宾比索。外延。调用现有的 PHP 函数

2022-08-30 21:14:51

所以我决定为php写一个扩展。一切似乎都很好,除了我被困在一个小问题上。

我有源代码。有文件与真棒功能php-5.4.9ext/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"
...

所以感觉很好,工作正常。但是,显然,我想使用从第101行开始到189结束的代码(http://pastie.org/5444192 粘贴中的5-93行)。所以我抓住了自己的想法(虽然在某些时候很尴尬),为什么不打电话?目前我无法找到该宏,实际上我想知道实现该想法的最佳方法。php_mailmail.cPHP_FUNCTION(mail)

我内心的zend工程师(新手)建议我使用call_user_function

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);

但是我不知道如何称呼它。

问题来了!如何(非常欢迎带有函数的示例)调用由 定义的函数?mailPHP_FUNCTION


答案 1

弄清楚函数如何工作的最简单方法是在 lxr.php.net 上搜索它。出现的第一个示例是在 readline 中:http://lxr.php.net/xref/PHP_TRUNK/ext/readline/readline.c#474

的用法是类似的。给定参数为 zvals (, , ),调用非常简单:mailto_zvalfrom_zvalmsg_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_ZVALZVAL_STRING


答案 2

推荐