PHP ve referanslar biraz sezgisel değildir. Doğru yerlerde uygun şekilde kullanılırsa, büyük performans iyileştirmeleri sağlayabilir veya çok çirkin geçici çözümlerden ve olağandışı kodlardan kaçınabilir.
Aşağıdakiler bir hata oluşturur:
function f(&$v){$v = true;}
f(&$v);
function f($v){$v = true;}
f(&$v);
Bunların hiçbiri aşağıdaki kurallara uyabilecekleri için başarısız olmak zorunda değildir, ancak birçok eski karışıklığı önlemek için şüphesiz kaldırılmış veya devre dışı bırakılmamıştır.
Çalışırlarsa, her ikisi de referansa yedekli bir dönüşüm içerir ve ikincisi de kapsamlandırılmış bir değişkene geri dönüşümü içerir.
İkincisi, referanslarla çalışmak için tasarlanmamış olan koda bir referansın geçmesine izin vermek mümkün olmuştu. Bu sürdürülebilirlik için son derece çirkin.
Bu hiçbir şey yapmaz:
function f($v){$v = true;}
$r = &$v;
f($r);
Daha spesifik olarak, referans istemediğiniz için referansı normal bir değişkene dönüştürür.
Bu çalışacak:
function f(&$v){$v = true;}
f($v);
Bu, bir referansı geçmediğinizi, ancak bir referans istediğinizi görür, bu yüzden referansa dönüştürür.
Bunun anlamı, bir referansın PHP'nin geçiş türlerinde veya bu durumda daha fazla meta türünde katı olduğu birkaç alandan biri olması için açıkça istenmediği bir işleve referans veremeyeceğinizdir.
Daha dinamik davranışa ihtiyacınız varsa, bu işe yarayacaktır:
function f(&$v){$v = true;}
$v = array(false,false,false);
$r = &$v[1];
f($r);
Burada bir referans istediğinizi ve zaten bir referansınız olduğunu görür, bu yüzden onu yalnız bırakır. Ayrıca referans zinciri olabilir ama bundan şüphe ediyorum.