PHP。扩大。调用现有的 PHP 函数

标签 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)

在我的扩展程序中,在 acme.c 中我包含了

...
#include "php.h"
#include "ext/standard/php_mail.h"
#include "php_ini.h"
...

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

但是我不知道怎么调用它。

问题!如何(mail 函数示例非常受欢迎)调用PHP_FUNCTION 定义的函数?

最佳答案

了解函数如何工作的最简单方法是在 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);

如果您还没有作为 zval 的参数,那么您可以使用 MAKE_STD_ZVALZVAL_STRING 创建它们。

关于PHP。扩大。调用现有的 PHP 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13592037/

相关文章:

php - PHP 中的静态函数变量和连接

php - 如何像facebook一样显示图片

php - 招投标系统PHP-MYSQL

php - 如何为 PHP 应用程序开发 C 扩展?

php - PHP 扩展中的 SEG 错误

php - sql查询获取符合条件的记录

iphone - 我遇到内存泄漏,负责的框架是 strdup。谁能给我一些线索?

将函数转换为函数指针

c - 这个 C 函数是不是写得很糟糕?

php - 从扩展返回 "Native"PHP 对象