3

让我详细说明一下标题。例如考虑 PHP_FUNCTION(session_start)。我是否能够从另一个 PHP_FUNCTION 的 session_id 中调用 session_start(这只是为了说明而不是实际目的)?

4

2 回答 2

6

嗯,是的,但你应该尽可能避免它。编写函数的内部实现的主要好处之一是,与 PHP 中发生的情况相反,C 函数调用很便宜。此外,在 C 代码内部调用 PHP 函数是比较痛苦的。

例如,在 的情况下session_start,您有php_session_start,它由会话扩展公开。由于我在第一段中描述的内容,扩展通常会导出可能对其他人有用的 C 函数。

事实上,内部 PHP 函数foo需要调用内部 PHP 函数bar,如果可能的话,最好的策略是定义一个辅助(非PHP_FUNCTION)C 函数,其中大部分实现是bar. 然后两者都PHP_FUNCTION(foo)可以PHP_FUNCTION(bar)调用该辅助函数。

无论如何,调用 PHP 函数的最简单方法是使用call_user_function

int call_user_function(HashTable *function_table, zval **object_pp,
    zval *function_name, zval *retval_ptr, zend_uint param_count,
    zval *params[] TSRMLS_DC);

该变体call_user_function_ex还允许在应通过引用发送参数时禁止分隔,并指定符号表。

如果相关函数是内部函数 ( PHP_FUNCTION) 或在用户空间中定义,这将起作用。如果它是一个常规函数,你应该使用EG(function_table)第一个参数,第二个应该是 NULL,我想你可以弄清楚其他的。

如果您多次执行该功能,这不是很有效。在这种情况下,请参阅“Zend_API.h”中以zend_fcall_.

我不推荐使用其他选项来调用内部函数,例如手动设置参数堆栈和其他技巧,然后手动调用底层 C 函数。

于 2010-09-01T03:53:21.220 回答
0

IE。session_start(session_id())

是的,但是在这种情况下它没有意义,因为session_id()需要会话已经开始。

于 2010-09-01T03:19:14.983 回答