PHP e referências não são intuitivas. Se usadas adequadamente, as referências nos lugares certos podem fornecer grandes melhorias de desempenho ou evitar soluções muito feias e códigos incomuns.
A seguir irá produzir um erro:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
Nada disso precisa falhar, pois pode seguir as regras abaixo, mas sem dúvida foi removido ou desativado para evitar muita confusão herdada.
Se eles funcionaram, ambos envolvem uma conversão redundante em referência e o segundo também envolve uma conversão redundante em uma variável contida no escopo.
O segundo costumava ser possível, permitindo que uma referência fosse passada para um código que não se destinava a trabalhar com referências. Isso é extremamente feio para manutenção.
Isso não fará nada:
function f($v){$v = true;}
$r = &$v;
f($r);
Mais especificamente, transforma a referência novamente em uma variável normal, pois você não solicitou uma referência.
Isso funcionará:
function f(&$v){$v = true;}
f($v);
Isso mostra que você está passando uma não referência, mas quer uma referência, então a transforma em uma referência.
O que isso significa é que você não pode passar uma referência a uma função em que uma referência não é solicitada explicitamente, tornando-a uma das poucas áreas em que o PHP é rigoroso quanto à passagem de tipos ou, nesse caso, mais do tipo meta.
Se você precisar de um comportamento mais dinâmico, isso funcionará:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
Aqui ele vê que você quer uma referência e já tem uma referência, então deixa em paz. Também pode encadear a referência, mas duvido disso.