Php 使用Memcached';s集方法

Php 使用Memcached';s集方法,php,pass-by-reference,memcached,Php,Pass By Reference,Memcached,我有一个很奇怪的问题。由于一个变量,我将一个var传递到memcached中,它会被更改。建议的解决方法是传递$data.'而不是$data,这样会破坏引用。但这对我来说不起作用,因为我不只是将字符串传递到memcached,而是传递所有数据类型 因此,我最终分配了一个新变量,如$dataPass=$data和传递$dataPass。但一些非常奇怪的事情正在发生: // ... var_dump("data 1"); var_dump($data); $dataPass = $data; /

我有一个很奇怪的问题。由于一个变量,我将一个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) ""
*/
/。。。
var_dump(“数据1”);
var_dump($数据);
$dataPass=$data;//取消对变量的引用
//因为http://pecl.php.net/bugs/bug.php?id=14239
var_dump(“数据2”);
var_dump($数据);
var_转储(“数据传递2”);
var_dump($dataPass);
$this->memcache->set($key、$dataPass、false、time()+$expire);
var_dump(“数据3”);
var_dump($数据);
var_dump(“数据传递3”);
var_dump($dataPass);
/*
字符串(11)“数据1”
布尔(假)
字符串(22)“数据2”
布尔(假)
字符串(26)“数据传递2”
布尔(假)
字符串(10)“数据3”

string(0)“如果我正确理解错误,问题是memcache扩展直接修改传递的值,而不是在进行修改之前进行复制(即,它不会分离值)

在这种情况下,这:

$dataPass = $data;
除了增加引用计数之外,什么也不做。看

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

$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版本是什么<代码>echo phpversion();死亡@Derek 5.2.10-2ubuntu6.4