• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 取消引用

    当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

    <?php
    $a = 1;
    $b =& $a;
    unset($a);
    ?>
    
    不会 unset$b,只是$a

    再拿这个和 Unix 的unlink调用来类比一下可能有助于理解。

    Simple look how PHP Reference works
    <?php
    /* Imagine this is memory map
     ______________________________
    |pointer | value | variable       |
     -----------------------------------
    |  1   | NULL |     ---      |
    |  2   | NULL |     ---      |
    |  3   | NULL |     ---      |
    |  4   | NULL |     ---      |
    |  5   | NULL |     ---      |
    ------------------------------------
    Create some variables  */
    $a=10;
    $b=20;
    $c=array ('one'=>array (1, 2, 3));
    /* Look at memory
     _______________________________
    |pointer | value |    variable's    |
     -----------------------------------
    |  1   | 10   |    $a        |
    |  2   | 20   |    $b        |
    |  3   | 1    |   $c['one'][0]  |
    |  4   | 2    |   $c['one'][1]  |
    |  5   | 3    |   $c['one'][2]  |
    ------------------------------------
    do */
    $a=&$c['one'][2];
    /* Look at memory
     _______________________________
    |pointer | value |    variable's    |
     -----------------------------------
    |  1   | NULL |    ---       | //value of $a is destroyed and pointer is free
    |  2   | 20   |    $b        |
    |  3   | 1    |   $c['one'][0]  |
    |  4   | 2    |   $c['one'][1]  |
    |  5   | 3    | $c['one'][2] ,$a | // $a is now here
    ------------------------------------
    do */
    $b=&$a; // or $b=&$c['one'][2]; result is same as both "$c['one'][2]" and "$a" is at same pointer.
    /* Look at memory
     _________________________________
    |pointer | value |    variable's      |
     --------------------------------------
    |  1   | NULL |    ---         | 
    |  2   | NULL |    ---         | //value of $b is destroyed and pointer is free
    |  3   | 1    |   $c['one'][0]    |
    |  4   | 2    |   $c['one'][1]    |
    |  5   | 3    |$c['one'][2] ,$a , $b | // $b is now here
    ---------------------------------------
    next do */
    unset($c['one'][2]);
    /* Look at memory
     _________________________________
    |pointer | value |    variable's      |
     --------------------------------------
    |  1   | NULL |    ---         | 
    |  2   | NULL |    ---         | 
    |  3   | 1    |   $c['one'][0]    |
    |  4   | 2    |   $c['one'][1]    |
    |  5   | 3    |   $a , $b       | // $c['one'][2] is destroyed not in memory, not in array
    ---------------------------------------
    next do  */
    $c['one'][2]=500;  //now it is in array
    /* Look at memory
     _________________________________
    |pointer | value |    variable's      |
     --------------------------------------
    |  1   | 500  |   $c['one'][2]    | //created it lands on any(next) free pointer in memory
    |  2   | NULL |    ---         | 
    |  3   | 1    |   $c['one'][0]    |
    |  4   | 2    |   $c['one'][1]    |
    |  5   | 3    |   $a , $b       | //this pointer is in use
    ---------------------------------------
    lets tray to return $c['one'][2] at old pointer an remove reference $a,$b. */
    $c['one'][2]=&$a;
    unset($a);
    unset($b);  
    /* look at memory
     _________________________________
    |pointer | value |    variable's      |
     --------------------------------------
    |  1   | NULL |    ---         | 
    |  2   | NULL |    ---         | 
    |  3   | 1    |   $c['one'][0]    |
    |  4   | 2    |   $c['one'][1]    |
    |  5   | 3    |   $c['one'][2]    | //$c['one'][2] is returned, $a,$b is destroyed
    --------------------------------------- ?>
    I hope this helps.
    <?php
    //if you do:
    $a = "hihaha";
    $b = &$a;
    $c = "eita";
    $b = $c;
    echo $a; // shows "eita"
    $a = "hihaha";
    $b = &$a;
    $c = "eita";
    $b = &$c;
    echo $a; // shows "hihaha"
    $a = "hihaha";
    $b = &$a;
    $b = null;
    echo $a; // shows nothing (both are set to null)
    $a = "hihaha";
    $b = &$a;
    unset($b);
    echo $a; // shows "hihaha"
    $a = "hihaha";
    $b = &$a;
    $c = "eita";
    $a = $c;
    echo $b; // shows "eita"
    $a = "hihaha";
    $b = &$a;
    $c = "eita";
    $a = &$c;
    echo $b; // shows "hihaha"
    $a = "hihaha";
    $b = &$a;
    $a = null;
    echo $b; // shows nothing (both are set to null)
    $a = "hihaha";
    $b = &$a;
    unset($a);
    echo $b; // shows "hihaha"
    ?>
    I tested each case individually on PHP 4.3.10.
    Here's an example of unsetting a reference without losing an ealier set reference
    <?php
    $foo = 'Bob';       // Assign the value 'Bob' to $foo
    $bar = &$foo;       // Reference $foo via $bar.
    $bar = "My name is $bar"; // Alter $bar...
    echo $bar;
    echo $foo;         // $foo is altered too.
    $foo = "I am Frank";    // Alter $foo and $bar because of the reference
    echo $bar;         // output: I am Frank
    echo $foo;         // output: I am Frank
    $foobar = &$bar;      // create a new reference between $foobar and $bar
    $foobar = "hello $foobar"; // alter $foobar and with that $bar and $foo
    echo $foobar;       //output : hello I am Frank
    unset($bar);        // unset $bar and destroy the reference
    $bar = "dude!";      // assign $bar
    /* even though the reference between $bar and $foo is destroyed, and also the 
    reference between $bar and $foobar is destroyed, there is still a reference 
    between $foo and $foobar. */
    echo $foo;         // output : hello I am Frank
    echo $bar;         // output : due!
    ?>
    
    Your idea about unsetting all referenced variables at once is right,
    just a tiny note that you changed NULL with unset()...
    again, unset affects only one name and NULL affects the data,
    which is kept by all the three names...
    <?php
    $a = 1;
    $b =& $a;
    $b = NULL; 
    ?>
    This does also work!
    <?php
    $a = 1;
    $b =& $a;
    $c =& $b;
    $b = NULL; 
    ?>
    
    clerca at inp-net dot eu dot org
    "
    If you have a lot of references linked to the same contents, maybe it could be useful to do this : 
    <?php
    $a = 1;
    $b = & $a;
    $c = & $b; // $a, $b, $c reference the same content '1'
    $b = NULL; // All variables $a, $b or $c are unset
    ?>
    "
    ------------------------
    NULL will not result in unseting the variables.
    Its only change the value to "null" for all the variables.
    becouse they all points to the same "part" in the memory.

    上篇:引用返回

    下篇:引用定位