PHP und Referenzen sind etwas unintuitiv. Bei sachgemäßer Verwendung können Referenzen an den richtigen Stellen große Leistungsverbesserungen bewirken oder sehr hässliche Problemumgehungen und ungewöhnlichen Code vermeiden.
Folgendes führt zu einem Fehler:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
Keines davon muss scheitern, da es den folgenden Regeln folgen könnte, aber zweifellos entfernt oder deaktiviert wurde, um eine Menge Verwirrung zu vermeiden.
Wenn sie funktioniert haben, beinhalten beide eine redundante Konvertierung in eine Referenz und die zweite beinhaltet auch eine redundante Konvertierung zurück in eine enthaltene Variable mit Gültigkeitsbereich.
Die zweite war früher möglich, um die Übergabe einer Referenz an Code zu ermöglichen, der nicht für die Verwendung mit Referenzen vorgesehen war. Dies ist für die Wartbarkeit äußerst hässlich.
Dies wird nichts tun:
function f($v){$v = true;}
$r = &$v;
f($r);
Insbesondere wird die Referenz wieder in eine normale Variable umgewandelt, da Sie nicht nach einer Referenz gefragt haben.
Das wird funktionieren:
function f(&$v){$v = true;}
f($v);
Dadurch wird angezeigt, dass Sie eine Nichtreferenz übergeben, aber eine Referenz möchten, sodass diese in eine Referenz umgewandelt wird.
Dies bedeutet, dass Sie keinen Verweis auf eine Funktion übergeben können, bei der ein Verweis nicht explizit aufgefordert wird, ihn zu einem der wenigen Bereiche zu machen, in denen PHP die Übergabe von Typen strengstens einschränkt oder in diesem Fall eher einen Metatyp darstellt.
Wenn Sie ein dynamischeres Verhalten benötigen, funktioniert dies:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
Hier sehen Sie, dass Sie eine Referenz möchten und bereits eine Referenz haben, lassen Sie sie also in Ruhe. Es kann auch die Referenz verketten, aber ich bezweifle dies.