Votre navigateur n'est pas à jour !

Merci de mettre à jour votre navigateur pour utiliser mon blog. Mettre à jour mon navigateur maintenant

×

PHP 5 - Assignation par référence

Date de publication 25 sept. 2012

1) Gestion des variables

Toutes informations stockées par PHP l’est par copie. Celles-ci sont stockés dans un Zval Container qui en plus de son type et sa donnée, contient un is_ref et un refcount.
is_ref est mis à 1 si la variable est passé par référence (voir plus loin dans l’article).
refcount est incrémenté à chaque fois qu’une variable pointe sur le même contenu.

2) Affectation par valeur

Le signe = est une assignation par valeur. Dans ce cas le refcount est incrémenté de 1. Ceci permet d’économiser de l’espace mémoire, en ne recopiant pas une donnée identique.
$a = 'test' ;
$b = &$a ;
$c = $b ;

3) Affectation par référence

Le signe est une assignation par référence. Dans ce cas le refcount est incrémenté de 1, le is_ref est mis à 1. 
Si le is_ref est déjà égal à 1, on met à jour le contenu directement.
Le unset() permet de libérer de la mémoire, il fait :
Destruction variable si le refcount=1
Décrémente le refcount sinon

$a = array('foo'=>'bar', 1 => 82);
$b = $a['foo'];
$c = &$a[1];
$c = 'dvp';
unset($a);

4) Gestion des Objet

En PHP5, l’objet n’est pas dans le zval mais c’est un numéro unique contenu dans la mémoire globale du ZendEngine (Object Store).
Les affectations sur des symboles se fait par copie de ce numéro d’identifiant, mais l’objet reste unique

5) Gestion des fonctions

Quand un argument est passé à une fonction, il est copié dans la « pile d’argument » pour être placé dans l’espace de visibilité de la fonction. Ainsi, le zval est isolé.
Mais PHP peut communiquer avec la pile au moyen des fonctions func_get_args() et func_num_args().
Une pile à une durée de vie égale au temps d’exécution de la fonction.
Si on veut modifier le contenu de la variable il faut la passer par référence.
Le retour de la fonction est fait par copie.  

6) Degugger

Une fonction existe qui permet de connaitre le refcount : debug_zval_dump();
Attention cette fonction incrémente le zval pour le variable passé par valeur (et non par référence)

7) Erreurs courantes

Les references se sont sur des variables : pas possible de faire

&test(){
   return 'string' ;
}

mais
&test(){
   $a ='string' ;
   return $a ;
}

Erreur de référence à ne pas faire :
function foo(&$var)
{
   $var = "bar";
   return $var;
}
$a = "foobaz";
$b = foo($a);

De passer $var par référence oblige de dupliquer les données :

$a = « boobaz » et $b = « boobaz »

Par copie on aurait

$a = « boobaz » et $b = « bar »
blog comments powered by Disqus