让我详细说明一下标题。例如考虑 PHP_FUNCTION(session_start)。我是否能够从另一个 PHP_FUNCTION 的 session_id 中调用 session_start(这只是为了说明而不是实际目的)?
2 回答
嗯,是的,但你应该尽可能避免它。编写函数的内部实现的主要好处之一是,与 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 函数。
IE。session_start(session_id())
是的,但是在这种情况下它没有意义,因为session_id()
需要会话已经开始。