php - 是否可以从扩展中调用 PHP_FUNCTION

标签 php php-extension

让我详细说明标题。考虑例如 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 - ZF2 - 基于完整路径在 View 中显示图像

c - 就性能和可用性而言,您认为编写一个新的 PHP 框架作为 PHP 扩展(用 C 语言)是个好主意吗?

php - 如何替换内部 PHP 方法?

command-line-interface - 从命令行检查动态加载的 PHP 扩展

php - 网站应如何处理数据库崩溃

php - 使用 mssql 方法(Mac OS X 上的 FreeTDS、PHP 和 Apache)

php - php-src c 文件最后的注释是什么意思?

php - PDO_SQLITE 驱动程序不存在.. 怎么办?

php - Zend - 从 Controller 访问布局属性

php - 如何使用 $_get VARIABLE IN WHERE 更新 Php Mysql 的表