PHP’nin saçmalıkları: Closure’ların aslında closure olmaması

Yine bu afedersiniz PHP yapacağını yaptı.. Bir de sorunu anlayıp kendisine has derme-çatma bir çözümle süsledikten sonra pis pis sırıtıyor ki sormayın.. 😀

Şimdi efenim bu PHP hazretlerinin closure’ları desteklediğini biliyoruz tabi ki bu bir yalan 😀 Meğer bu closure dediğimiz zımbırtı closure değilmiş.. Olay çok basit;

Bunu referansları kullanarak;

yada böyle çözmek mümkün;

Herşey iyi hoş çalışıyor en azından diyebiliriz tabii ama lakin ki öyle değildir 😀 PHP kendi yaklaşımının COW (Copy on Write) olduğunu söylüyor. Bu durumda use ($foo, $bar)  şeklinde lexical scope olarak kullanacağımız değişkenleri closure için PHP hazretlerine belirtiyoruz.. Elbette &$degisken  yerine $degisken dediğimizde insan bir an soruyor acaba bu $degisken  ayrıca bellekte kopyalanıyor mu? diye ama COW yaklaşımından dolayı kopyalamıyor ancak closure içinde değişirse PHP COW yapıyor.

Buraya kadar herşey normal gibi ama örneği birde şöyle deneyelim;

Evet closure kendini çağıramadı çünkü kendini göremiyor 😀 PHP closure’ları  use ($foo, &$bar)  sentaksı ile belirtilen değişkenleri en başta tanımlayarak yorumluyor. Closure kendini çağıramıyor çünkü PHP kendisini tanımlarken henüz kendisi yok 😀 Dolayısıyla kendisi tanımlanırken olmayan kendisini lexical scope’a belirtemiyor.. Bunu use ($f)  şeklinde değil de use (&$f)  şeklinde belirterek çözüyoruz. Böylece PHP’miz $f’yi sadece değişken referansı olarak aktarıyor ve fonksiyon bu değişkene tanımlandığında olay çözülüyor.

Tabi daha öncede belirttiğim gibi bütün bunlar nerede ne şekilde yorumlanıyor çok merak ediyorum zira bir önceki yazı da (PHP’nin Hastalıkları -1 (Referansların düzgün çalışmaması)) bahsettiğim gibi referanslar da düzgün çalışmıyor 😀

İşte süper closure ve lexical scope örneği 😀 Bazen insan korkmuyor değil lan bu PHP bir yerlerde “aga bu kadarı beni aşar ben SIGSEGV döndürür kaçarım hadi eyv..” derse diye düşünmüyor değilim 😀

Share Button

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir