通过引用将变量传递到 PHP 扩展中

发布于 2024-07-15 12:07:51 字数 157 浏览 8 评论 0原文

我正在编写一个 PHP 扩展,它引用一个值并更改它。 PHP 示例:

$someVal = "input value";
TestPassRef($someVal);
// value now changed

什么是正确的方法?

I'm writing a PHP extension that takes a reference to a value and alters it. Example PHP:

$someVal = "input value";
TestPassRef($someVal);
// value now changed

What's the right approach?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

霓裳挽歌倾城醉 2024-07-22 12:07:51

编辑2011年9月13日
正确的方法是使用 ZEND_BEGIN_ARG_INFO() 系列宏 - 请参阅 扩展和嵌入 PHP 第 6 章(Sara Golemon,开发人员库)

此示例函数按值采用一个字符串参数(由于 ZEND_ARG_PASS_INFO(0) 调用),并通过引用采用此后的所有其他参数(由于 ZEND_BEGIN_ARG_INFO 的第二个参数为 1 )。

const int pass_rest_by_reference = 1;
const int pass_arg_by_reference = 0;

ZEND_BEGIN_ARG_INFO(AllButFirstArgByReference, pass_rest_by_reference)
   ZEND_ARG_PASS_INFO(pass_arg_by_reference)
ZEND_END_ARG_INFO()

zend_function_entry my_functions[] = {
    PHP_FE(TestPassRef, AllButFirstArgByReference)
};

PHP_FUNCTION(TestPassRef)
{
    char *someString = NULL;
    int lengthString = 0;
    zval *pZVal = NULL;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &someString, &lengthString, &pZVal) == FAILURE)
    {
        return;
    }

    convert_to_null(pZVal);  // Destroys the value that was passed in

    ZVAL_STRING(pZVal, "some string that will replace the input", 1);
}

在添加 convert_to_null 之前,它会在每次调用时泄漏内存(我不知道在添加 ZENG_ARG_INFO() 调用后是否有必要这样做)。

Edit 2011-09-13:
The correct way to do this is to use the ZEND_BEGIN_ARG_INFO() family of macros - see Extending and Embedding PHP chapter 6 (Sara Golemon, Developer's Library).

This example function takes one string argument by value (due to the ZEND_ARG_PASS_INFO(0) call) and all others after that by reference (due to the second argument to ZEND_BEGIN_ARG_INFO being 1).

const int pass_rest_by_reference = 1;
const int pass_arg_by_reference = 0;

ZEND_BEGIN_ARG_INFO(AllButFirstArgByReference, pass_rest_by_reference)
   ZEND_ARG_PASS_INFO(pass_arg_by_reference)
ZEND_END_ARG_INFO()

zend_function_entry my_functions[] = {
    PHP_FE(TestPassRef, AllButFirstArgByReference)
};

PHP_FUNCTION(TestPassRef)
{
    char *someString = NULL;
    int lengthString = 0;
    zval *pZVal = NULL;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &someString, &lengthString, &pZVal) == FAILURE)
    {
        return;
    }

    convert_to_null(pZVal);  // Destroys the value that was passed in

    ZVAL_STRING(pZVal, "some string that will replace the input", 1);
}

Before adding the convert_to_null it would leak memory on every call (I've not whether this is necessary after adding ZENG_ARG_INFO() calls).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文