- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
让我详细说明标题。考虑例如 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/
让我详细说明标题。考虑例如 PHP_FUNCTION(session_start)。我能否从另一个 PHP_FUNCTION 的 session_id 中调用 session_start(这只是为了说
我想用 visual studio 2010 创建一个 php 扩展,我是 c++ 的初学者。 我在 C++ 中的最后一个函数是: PHP_FUNCTION(DoubleUp){ char*
我需要在 PHP_FUNCTION() 中调用一个函数C 中的函数以扩展 PHP,这是一个多线程脚本,函数本身使用 int main() 可以完美运行.这是我努力实现的目标。 #define NUM_
我是一名优秀的程序员,十分优秀!