让我详细说明标题。考虑例如 PHP_FUNCTION(session_start)。我能否从另一个 PHP_FUNCTION 的 session_id 中调用 session_start(这只是为了说明而不是实际目的)?
最佳答案
嗯,是的,但你应该尽可能避免它。编写函数的内部实现的主要好处之一是,与 PHP 中发生的情况相反,C 函数调用很便宜。此外,在 C 代码内部调用 PHP 函数相对痛苦。
例如,在 session_start
的情况下,您有 php_session_start
,它由 session 扩展公开。由于我在第一段中的描述,扩展通常会导出可能对其他人有用的 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 函数。
关于php - 是否可以从扩展中调用 PHP_FUNCTION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3614758/