让我详细说明标题。考虑例如PHP_FUNCTION(session_start)。我是否能够在session_id中调用session_start,这是另一个PHP_FUNCTION(这只是为了说明而不是实际目的)?
答案 0 :(得分: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_fcall_
开头的"Zend_API.h"中的功能。
我不推荐其他选项来调用内部函数,例如手动设置参数堆栈和其他技巧,以及手动调用底层C函数。
答案 1 :(得分:0)
即。 session_start(session_id())
是的,但是在这种情况下它没有意义,因为session_id()
要求会话已经开始。