PHP e riferimenti non sono abbastanza intuitivi. Se usato in modo appropriato, i riferimenti nei posti giusti possono fornire grandi miglioramenti delle prestazioni o evitare soluzioni molto brutte e codice insolito.
Quanto segue produrrà un errore:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
Nessuno di questi deve fallire in quanto potrebbe seguire le regole seguenti ma senza dubbio è stato rimosso o disabilitato per evitare molta confusione ereditaria.
Se hanno funzionato, entrambi implicano una conversione ridondante in riferimento e la seconda comporta anche una conversione ridondante in una variabile contenuta con ambito.
Il secondo era possibile consentire il passaggio di un riferimento al codice che non era destinato a funzionare con i riferimenti. Questo è estremamente brutto per la manutenibilità.
Questo non farà nulla:
function f($v){$v = true;}
$r = &$v;
f($r);
Più specificamente, trasforma il riferimento in una normale variabile in quanto non è stato richiesto un riferimento.
Questo funzionerà:
function f(&$v){$v = true;}
f($v);
Questo vede che stai passando un non-riferimento ma vuoi un riferimento, quindi lo trasforma in un riferimento.
Ciò significa che non è possibile passare un riferimento a una funzione in cui un riferimento non viene esplicitamente richiesto per renderlo una delle poche aree in cui PHP è rigoroso nel passaggio di tipi o in questo caso più di un meta-tipo.
Se hai bisogno di un comportamento più dinamico questo funzionerà:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
Qui vede che vuoi un riferimento e hai già un riferimento, quindi lo lascia da solo. Potrebbe anche incatenare il riferimento ma ne dubito.