PHP y las referencias son algo poco intuitivas. Si se usan adecuadamente, las referencias en los lugares correctos pueden proporcionar grandes mejoras de rendimiento o evitar soluciones muy feas y códigos inusuales.
Lo siguiente producirá un error:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
Ninguno de estos tiene que fallar, ya que podrían seguir las reglas a continuación, pero sin duda se han eliminado o deshabilitado para evitar mucha confusión heredada.
Si funcionaron, ambos implican una conversión redundante a referencia y el segundo también implica una conversión redundante a una variable contenida en el ámbito.
El segundo solía ser posible permitiendo que se pasara una referencia al código que no estaba destinado a funcionar con referencias. Esto es extremadamente feo para la mantenibilidad.
Esto no hará nada:
function f($v){$v = true;}
$r = &$v;
f($r);
Más específicamente, convierte la referencia nuevamente en una variable normal, ya que no ha solicitado una referencia.
Esto funcionará:
function f(&$v){$v = true;}
f($v);
Esto ve que está pasando una no referencia pero desea una referencia, por lo que la convierte en una referencia.
Lo que esto significa es que no puede pasar una referencia a una función en la que no se solicita explícitamente una referencia para convertirla en una de las pocas áreas donde PHP es estricto al pasar tipos o, en este caso, más de un metatipo.
Si necesita un comportamiento más dinámico, esto funcionará:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
Aquí ve que desea una referencia y ya tiene una referencia, así que la deja sola. También puede encadenar la referencia, pero lo dudo.