Ok fonksiyonu kısa bir anonim fonksiyondur: fn($x) => $x * 2. => sonrasındaki gövde, değeri döndürülen tek bir ifadedir ve ifadenin kullandığı çevredeki koddan her değişken otomatik olarak, değerle yakalanır. Ok fonksiyonları PHP 7.4'ten beri vardır ve çoğunlukla geri çağırma olarak kullanılır.
Söz dizimi
fn, parametre listesi, =>, tek bir ifade. Parametre türleri, varsayılan değerler ve dönüş türü normal fonksiyonlardaki gibi çalışır:
return anahtar kelimesi ve süslü parantez yoktur. Uzun bir ifade okunurluk için yine de birkaç satıra bölünebilir.
Dış değişkenler değerle yakalanır
Bir ok fonksiyonu oluşturulduğu kapsamın her değişkenini görür. Değerlerini o anda kopyalar. İçeride yapılan değişiklikler içeride kalır ve fonksiyon oluşturulduktan sonra dışarıda yapılan değişiklikler görülmez:
Bir değişkeni referansla paylaşabilen function () use (&$count) ile temel fark budur. Bir ok fonksiyonu dışarıdaki bir değişkene yeniden atama yapamaz. Yakaladığı bir nesneyi yine de değiştirebilir (kopya aynı nesneye bir tanıtıcıdır) ve referansla bildirilen bir parametre her fonksiyonda olduğu gibi çalışır: fn(array &$list) => $list[] = 'x'.
array_map, array_filter ve usort için geri çağırmalar
Çoğu dizi fonksiyonu bir geri çağırma alır ve ok fonksiyonlarının en çok kalabalıktan kurtardığı yer orasıdır. İki şekilde yazılmış bir filtreyi karşılaştırın:
<=> -1, 0 veya 1 döndürür, usort() tam olarak bunu ister, bu yüzden bir alana göre sıralama tek satıra sığar. Azalan sıralamak için $a ve $b yerini değiştirin.
Ok fonksiyonu döndüren ok fonksiyonları
Yakalanan değişkenler, dıştaki bir ok fonksiyonunun parametrelerini de içerir, bu yüzden onları iç içe yazarak başka değerlerden fonksiyonlar oluşturabilirsiniz:
array_filter() orijinal anahtarları koruduğu için sonucun 1 indeksinden başladığına dikkat edin.
fn ile function: ne zaman tam bir closure gerekir
Gövde birden fazla ifade gerektirdiğinde ya da dışarıdaki bir değişkeni değiştirmesi gerektiğinde ok fonksiyonları yetmez. O zaman bir anonim fonksiyon kullanın:
fn($x) => ... | function ($x) use ($y) { ... } | |
|---|---|---|
| Gövde | tek bir ifade | herhangi bir deyim |
| Dönüş | otomatik | açık return |
| Dış değişkenler | kullanılanların hepsi, otomatik | yalnızca use içinde listelenenler |
| Referansla yakalama | hayır | evet, use (&$y) |
| Şu sürümden beri | PHP 7.4 | PHP 5.3 |
Bir ok fonksiyonu dar geldiğinde bu çoğu zaman işin aslında iki iş olduğu anlamına gelir. Yukarıdaki gibi bir filtre ve bir toplama bölmek her geri çağırmayı tek bir ifade olarak tutar.
Sıkça Sorulan Sorular
PHP'de ok fonksiyonu nedir?
PHP 7.4'te gelen kısa bir anonim fonksiyondur: fn($x) => $x * 2. Gövdesi, değeri otomatik olarak döndürülen tek bir ifadedir ve çevredeki kapsamdan değişkenleri use ifadesi olmadan okuyabilir.
Bir PHP ok fonksiyonu birden çok satırdan oluşabilir mi?
Hayır. => sonrasındaki gövde tek bir ifade olmalıdır; deyimlerden oluşan bir blok yoktur. Uzun bir ifadeyi satırlara bölebilirsiniz, ama if, döngüler veya birkaç deyim gerekiyorsa bunun yerine function () use (...) { ... } kullanın.
Bir ok fonksiyonu dışarıdaki bir değişkeni değiştirebilir mi?
Hayır. Ok fonksiyonları dış değişkenleri değerle yakalar, bu yüzden fn() => $count++ yalnızca kendi kopyasını değiştirir ve dışarıdaki $count aynı kalır. Dışarıdaki bir değişkeni değiştirmek için use (&$count) ile bir closure kullanın.
PHP'de fn ile function arasındaki fark nedir?
fn($x) => ... tek bir ifade tutar, onu örtük olarak döndürür ve kullandığı her dış değişkeni değerle yakalar. function ($x) use ($y) { ... } herhangi bir deyim tutabilir, açık bir return gerektirir ve yalnızca use içinde listelenen değişkenleri görür; bunlar referansla da yakalanabilir.