PHP et les références ne sont pas intuitives. Si elles sont utilisées correctement, les références aux bons endroits peuvent améliorer considérablement les performances ou éviter des solutions de contournement très laides et un code inhabituel.
Ce qui suit produira une erreur:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
Aucun de ceux-ci ne doit échouer car ils pourraient suivre les règles ci-dessous mais ont sans aucun doute été supprimés ou désactivés pour éviter beaucoup de confusion héritée.
S'ils ont fonctionné, les deux impliquent une conversion redondante en référence et la seconde implique également une conversion redondante en une variable contenue de portée.
Le second était auparavant possible, permettant de passer une référence à du code qui n'était pas destiné à fonctionner avec des références. C'est extrêmement moche pour la maintenabilité.
Cela ne fera rien:
function f($v){$v = true;}
$r = &$v;
f($r);
Plus précisément, il transforme la référence en une variable normale car vous n'avez pas demandé de référence.
Cela fonctionnera:
function f(&$v){$v = true;}
f($v);
Cela montre que vous passez une non-référence mais que vous voulez une référence, la transforme donc en référence.
Cela signifie que vous ne pouvez pas passer une référence à une fonction où une référence n'est pas explicitement demandée pour en faire l'un des rares domaines où PHP est strict sur les types de passage ou dans ce cas plus d'un type méta.
Si vous avez besoin d'un comportement plus dynamique, cela fonctionnera:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
Ici, il voit que vous voulez une référence et que vous avez déjà une référence, alors laissez-le tranquille. Il peut également enchaîner la référence mais j'en doute.