gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:37:56 25 4
gpt4 key购买 nike

让我详细说明标题。考虑例如 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com