gpt4 book ai didi

php - 使用 Memcached 的 set 方法时看似不可能的 PHP 变量引用行为

转载 作者:搜寻专家 更新时间:2023-10-31 21:45:58 25 4
gpt4 key购买 nike

我有一个很奇怪的问题。因为 certain PECL bug ,我将一个 var 传递给 memcached,它被改变了。建议的解决方法是传递 $data.'' 而不是 $data,这样会破坏引用。但这对我不起作用,因为我不只是将字符串传递到 memcached,我传递了所有数据类型。

所以我最终分配了一个新变量,例如 $dataPass = $data 并传递了 $dataPass。但是一些非常奇怪的事情正在发生:

// ...

var_dump("data 1");
var_dump($data);

$dataPass = $data; // Dereferencing the variable
// because of http://pecl.php.net/bugs/bug.php?id=14239

var_dump("data 2");
var_dump($data);
var_dump("dataPass 2");
var_dump($dataPass);

$this->memcache->set($key, $dataPass, false, time() + $expire);

var_dump("data 3");
var_dump($data);
var_dump("dataPass 3");
var_dump($dataPass);

/*
string(11) "data 1"
bool(false)
string(22) "data 2"
bool(false)
string(26) "dataPass 2"
bool(false)
string(10) "data 3"
string(0) "" <--- Why is this not bool(false)?
string(14) "dataPass 3"
string(0) ""
*/

最佳答案

如果我对错误的理解是正确的,那么问题是内存缓存扩展直接修改了传递的值,而不是在进行修改之前进行复制(即,它不分离值)。

在那种情况下,这:

$dataPass = $data;

除了增加引用计数之外什么都不做。参见 reference counting basics .

强制分离的一种方法是创建一个引用集,然后将其打断:

$data = false; //$data's zval: refcount 1, is_ref 0
$dataPassPre =& $data; //$data/$dataPassPre zval: refcount 2, is_ref 1
//equivalently to below: $dataPass = $dataPassPre;
$dataPass = $data; //$dataPass's zval: has refcount 1, is_ref 0
unset($dataPassPre); //restore $data's zval to refcount 1, is_ref 0
//now pass $dataPass

关于php - 使用 Memcached 的 set 方法时看似不可能的 PHP 变量引用行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3697297/

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