Arkadaşlar selam, uzun zamandır PHP ile uğraşıyorum ve geçenlerde bir projede foreach ile referans kullanırken başıma gelen bir olayı sizinle paylaşmak istedim. Bildiğiniz gibi foreach döngüsünde değişkenin önüne & işareti koyarak orijinal dizi elemanlarını doğrudan değiştirebiliyoruz. Mesela $dizi = [1,2,3]; foreach($dizi as &$deger) { $deger *= 2; } yapınca dizi [2,4,6] oluyor, çok pratik. Ama işte burada bir tuzak var: döngü bittikten sonra $deger değişkeni hala son elemana referans olarak kalıyor. Yani bellekten silinmiyor, hala o son elemanı işaret ediyor. Bunu fark etmezseniz, döngüden sonra $deger ile başka bir işlem yaparsanız veya aynı değişken ismini başka yerde kullanırsanız istenmeyen sonuçlar doğabiliyor.
Bir keresinde şöyle bir senaryo yaşadım: Bir diziyi düzenlemek için foreach ile referans kullandım, döngü bitti, sonra aynı script içinde başka bir foreach daha açtım farklı bir dizi için ama yanlışlıkla aynı $deger değişkenini kullanmaya devam ettim. İkinci döngüdeki atamalar, ilk dizinin son elemanını da değiştirdi ve veriler birbirine girdi. Bu hatayı yakalamak bayağı uğraştırdı, çünkü hata belli belirsizdi. Sonra çözüm olarak foreach döngüsünden hemen sonra unset($deger) ile referansı temizlemeyi alışkanlık haline getirdim. Siz de bu konuda benzer sorunlar yaşadınız mı? Yoksa daha farklı önlemler mi alıyorsunuz?
Bir de şu var: foreach içinde referans kullanırken dizi elemanlarını değiştirmek cazip ama bazen gereksiz yere bellek kullanımını artırabiliyor mu? Özellikle büyük dizilerde performans açısından bir fark yaratır mı, yoksa normal foreach ile yeni bir dizi oluşturup atama yapmak mı daha sağlıklı? Mesela ben genelde referans kullanmayı tercih ediyorum çünkü kod daha kısa ve okunabilir oluyor, ama bu alışkanlık yanlış mı? Bu konuda tecrübesi olan varsa yorumlarını merak ediyorum. Ayrıca çok boyutlu dizilerde referans kullanırken dikkat edilmesi gereken başka noktalar var mı?
Bir keresinde şöyle bir senaryo yaşadım: Bir diziyi düzenlemek için foreach ile referans kullandım, döngü bitti, sonra aynı script içinde başka bir foreach daha açtım farklı bir dizi için ama yanlışlıkla aynı $deger değişkenini kullanmaya devam ettim. İkinci döngüdeki atamalar, ilk dizinin son elemanını da değiştirdi ve veriler birbirine girdi. Bu hatayı yakalamak bayağı uğraştırdı, çünkü hata belli belirsizdi. Sonra çözüm olarak foreach döngüsünden hemen sonra unset($deger) ile referansı temizlemeyi alışkanlık haline getirdim. Siz de bu konuda benzer sorunlar yaşadınız mı? Yoksa daha farklı önlemler mi alıyorsunuz?
Bir de şu var: foreach içinde referans kullanırken dizi elemanlarını değiştirmek cazip ama bazen gereksiz yere bellek kullanımını artırabiliyor mu? Özellikle büyük dizilerde performans açısından bir fark yaratır mı, yoksa normal foreach ile yeni bir dizi oluşturup atama yapmak mı daha sağlıklı? Mesela ben genelde referans kullanmayı tercih ediyorum çünkü kod daha kısa ve okunabilir oluyor, ama bu alışkanlık yanlış mı? Bu konuda tecrübesi olan varsa yorumlarını merak ediyorum. Ayrıca çok boyutlu dizilerde referans kullanırken dikkat edilmesi gereken başka noktalar var mı?