gpt4 book ai didi

php - 我可以通过与其他变量分开的引用在 PHP 扩展中传递字符串吗?

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:26 25 4
gpt4 key购买 nike

我有示例代码:

ZEND_BEGIN_ARG_INFO(arginfo_refstring, 0)
ZEND_ARG_INFO(1, s1)
ZEND_END_ARG_INFO()

const zend_function_entry refstring_functions[] = {
PHP_FE(refstring, arginfo_refstring)
PHP_FE_END
};

PHP_FUNCTION(refstring)
{
char *s1;
int s1_len;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &s1, &s1_len) == FAILURE) {
return;
}

s1[0] = 'X';
}

和php代码:

$s1 = 'hello';
$s2 = $s1;
refstring($s1);
var_dump($s1, $s2);

我希望:

string(5) "Xello"
string(5) "hello"

但是我得到了:

string(5) "Xello"
string(5) "Xello"

How can I separate $s2 from $s1, but keep the ability to change $s1 inside function?

我知道 SEPARATE_ZVAL 和公司,但他们没有帮助...

最佳答案

发生这种情况是因为一种称为写时复制的机制。

在这行之后:

$s1 = 'hello';
$s2 = $s1;

$s1$s2 都是自变量 (zvals),但它们指向内存中的相同(!)数据 - 因为它们共享相同的值,这意味着到目前为止它们都没有改变。

如果你愿意:

$s1 = 'foo';

... PHP 会在内部更新 $s1 后面的 zval,使其值指向内存的不同部分。

但是,由于您正在修改扩展函数中的值,因此该函数需要自行处理:

PHP_FUNCTION(refstring)
{
zval *s1;
char *string;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &s1)
!= SUCCESS
) {
return;
}

// copy the value before writing to it
string = strdup(s1->value.str.val);
string[0] = 'X';

ZVAL_STRING(s1, string, 1);
}

请注意,我使用的是 zval * 而不是使用纯字符串作为输入参数。

进一步注意,上述功能按预期工作。但是,我不确定是否有用于此目的的 MACRO 可以更优雅地使用。

关于php - 我可以通过与其他变量分开的引用在 PHP 扩展中传递字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32097304/

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