Arkadaşlar merhaba, uzun süredir PHP ile uğraşıyorum ama dün gece basit gibi görünen bir foreach döngüsünde resmen duvara tosladım. Bir dizim var, içinde kullanıcı bilgileri tutuyorum ve her bir kullanıcıya bazı ek alanlar eklemek istiyorum. Normalde foreach ($dizi as $key => $deger) şeklinde dönüp $dizi[$key]['yeni_alan'] = 'deger' ataması yapıyorum, bu çalışıyor. Ama işin içine referans (&) işaretini karıştırınca işler değişiyor.
Şöyle ki, foreach ($dizi as &$deger) yapıp $deger['yeni_alan'] = 'deger' şeklinde atama yapınca döngü sonunda $deger değişkeni hala son elemanı referans olarak tutuyor. Sonra bu $deger'i başka bir yerde kullanırsam, aslında dizinin son elemanını değiştiriyorum farkında olmadan. Bunu fark ettiğimde şok oldum, çünkü iki saatimi yedi. unset($deger) ile temizlemeyi denedim ama bazen unutuyorum, özellikle büyük projelerde bu tip hatalar gözden kaçabiliyor.
Sizce bu referans sorununu kalıcı olarak çözmek için en iyi pratik nedir? Referans kullanmaktan tamamen kaçınmak mı daha mantıklı, yoksa döngü sonunda mutlaka unset eklemek yeterli mi? Ayrıca bu durumun PHP'nin hangi sürümlerinde geçerli olduğunu merak ediyorum, belki yeni sürümlerde bir iyileştirme yapılmıştır? Tecrübelerinizi ve önerilerinizi duymak isterim.
Şöyle ki, foreach ($dizi as &$deger) yapıp $deger['yeni_alan'] = 'deger' şeklinde atama yapınca döngü sonunda $deger değişkeni hala son elemanı referans olarak tutuyor. Sonra bu $deger'i başka bir yerde kullanırsam, aslında dizinin son elemanını değiştiriyorum farkında olmadan. Bunu fark ettiğimde şok oldum, çünkü iki saatimi yedi. unset($deger) ile temizlemeyi denedim ama bazen unutuyorum, özellikle büyük projelerde bu tip hatalar gözden kaçabiliyor.
Sizce bu referans sorununu kalıcı olarak çözmek için en iyi pratik nedir? Referans kullanmaktan tamamen kaçınmak mı daha mantıklı, yoksa döngü sonunda mutlaka unset eklemek yeterli mi? Ayrıca bu durumun PHP'nin hangi sürümlerinde geçerli olduğunu merak ediyorum, belki yeni sürümlerde bir iyileştirme yapılmıştır? Tecrübelerinizi ve önerilerinizi duymak isterim.