代码之家  ›  专栏  ›  技术社区  ›  mattalxndr

在使用Memcached的set方法时,PHP变量引用行为似乎是不可能的

  •  3
  • mattalxndr  · 技术社区  · 16 年前

    我有个很奇怪的问题。因为一个 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) ""
    */
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   Artefacto    16 年前

    在这种情况下:

    $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
    
    推荐文章