Il faut plus voir ça comme deux opérateurs différents (et bien comprendre que $toto n'est pas une variable mais un symbole, qui pointe vers une variable):
L'opérateur = (qui change la valeur de la variable), et l'opérateur =& (qui fait pointer vers une variable)
$b =& $a; fait que le symbole "$b" pointe vers la même variable que le symbole "$a".
$b =& $c; fait que $b pointe maintenant vers $c, sans changer la valeur de $a.
$b = 'toto'; fait que la valeur de la variable pointée par $b change, pour devenir 'toto'. Comme $b et $c pointent vers la même variable, echo $c; affichera 'toto'.
Enfin, la fonction unset ne détruit pas une variable, mais un symbole. Donc
unset($b); fait que $b n'est pas utilisable, mais la valeur qu'il pointait reste inchangée, et ne sera détruite que si aucun symbole n'y fait référence (si on fait
unset($c) par exemple).
Par contre (oublions les deux unset précédents),
$b = null; change la valeur de la variable pointée par $b, donc $b et $c pointent toujours vers une même variable qui vaut maintenant null. Si par la suite on fait
$c = 'toto';, $b et $c valent de nouveau 'toto'.
Attention cependant avec les références explicites vers des objets !!! Explications
Ici, le symbole $b pointe bien vers une variable différente de $a, MAIS la valeur de cette variable est elle même une sorte de pointeur vers l'objet (référence implicite donc). Si maintenant on fait
$b = null; ou encore
unset($b), $a pointe toujours vers le "pointeur" de notre objet.
Compliquons un peu, pour que ça devienne amusant :
$a = new toto();
$b= $a;
$c =& $a;
Ici, on a $a et $c qui pointent vers la même
variable, qui est un "pointeur" vers notre objet. $b pointe vers sa propre variable, qui est elle aussi un pointeur vers l'objet. Donc si on fait
$a = null;, $a et $c pointent vers une variable de valeur "null", l'objet n'est pas modifié pour le moment.
Si on avait fait
$b = null; la variable pointée par $b serait devenue une variable contenant null, à la place du pointeur. Toujours pas de changement pour l'objet.
Si on avait fait
unset($b);, $b n'existant plus, la variable qu'il pointait n'est plus référencée donc est détruite. Le pointeur vers l'objet est donc détruit mais l'objet reste intact.
Maintenant évidement, si on fait :
unset($a);
unset($b);
unset($c);
Ou
$a = null;
unset($b);
Toutes les références vers notre objet vont être détruites, donc l'objet va être détruit.
Il faut plus voir ça comme deux opérateurs différents (et bien comprendre que $toto n'est pas une variable mais un symbole, qui pointe vers une variable):
L'opérateur = (qui change la valeur de la variable), et l'opérateur =& (qui fait pointer vers une variable)
[b]$b =& $a;[/b] fait que le symbole "$b" pointe vers la même variable que le symbole "$a".
[b]$b =& $c;[/b] fait que $b pointe maintenant vers $c, sans changer la valeur de $a.
[b]$b = 'toto';[/b] fait que la valeur de la variable pointée par $b change, pour devenir 'toto'. Comme $b et $c pointent vers la même variable, echo $c; affichera 'toto'.
Enfin, la fonction unset ne détruit pas une variable, mais un symbole. Donc [b]unset($b);[/b] fait que $b n'est pas utilisable, mais la valeur qu'il pointait reste inchangée, et ne sera détruite que si aucun symbole n'y fait référence (si on fait [b]unset($c)[/b] par exemple).
Par contre (oublions les deux unset précédents), [b]$b = null;[/b] change la valeur de la variable pointée par $b, donc $b et $c pointent toujours vers une même variable qui vaut maintenant null. Si par la suite on fait [b]$c = 'toto';[/b], $b et $c valent de nouveau 'toto'.
Attention cependant avec les références explicites vers des objets !!! Explications
[code]$a = new toto();
$b = $a;[/code]
Ici, le symbole $b pointe bien vers une variable différente de $a, MAIS la valeur de cette variable est elle même une sorte de pointeur vers l'objet (référence implicite donc). Si maintenant on fait [b]$b = null;[/b] ou encore [b]unset($b)[/b], $a pointe toujours vers le "pointeur" de notre objet.
Compliquons un peu, pour que ça devienne amusant :
[php]$a = new toto();
$b= $a;
$c =& $a;[/php]
Ici, on a $a et $c qui pointent vers la même [b]variable[/b], qui est un "pointeur" vers notre objet. $b pointe vers sa propre variable, qui est elle aussi un pointeur vers l'objet. Donc si on fait [b]$a = null;[/b], $a et $c pointent vers une variable de valeur "null", l'objet n'est pas modifié pour le moment.
Si on avait fait [b]$b = null;[/b] la variable pointée par $b serait devenue une variable contenant null, à la place du pointeur. Toujours pas de changement pour l'objet.
Si on avait fait [b]unset($b);[/b], $b n'existant plus, la variable qu'il pointait n'est plus référencée donc est détruite. Le pointeur vers l'objet est donc détruit mais l'objet reste intact.
Maintenant évidement, si on fait :
[php]
unset($a);
unset($b);
unset($c);
[/php]
Ou
[php]
$a = null;
unset($b);
[/php]
Toutes les références vers notre objet vont être détruites, donc l'objet va être détruit.