PHP.延期.调用现有的PHP函数

nka*_*amm 19 php c php-extension

所以我决定为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)
Run Code Online (Sandbox Code Playgroud)

在我的扩展中,acme.c我已经包括在内

...
#include "php.h"
#include "ext/standard/php_mail.h"
#include "php_ini.h"
...
Run Code Online (Sandbox Code Playgroud)

所以php_mail你感觉良好,工作正常.但是,显然,我想使用从mail.c第101行开始到189结束的代码(http://pastie.org/5444192 5-93对应的行中的代码).所以我抓住了自己的想法(虽然在某些方面很尴尬)为什么不打电话PHP_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);
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何称呼它.

这个问题!如何(非常欢迎mail函数的例子)调用由?定义的函数?PHP_FUNCTION

Nik*_*kiC 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);
Run Code Online (Sandbox Code Playgroud)

如果您没有zvals的参数,那么您可以使用MAKE_STD_ZVAL和创建它们ZVAL_STRING.

  • 嗯,方便,我没见过lxr.php.net.令人遗憾的是,这是找到api的最简单方法! (2认同)
  • 真棒!谢谢你的链接! (2认同)