PHP’de sık sık geri çağırma fonksiyonlarını array_map(), array_filter() ve array_reduce() gibi fonksiyonlarını kullanıyoruz. Peki bunların nasıl çalıştığını hiç merak ettiniz mi? Bu yazıyı okuduğunuza göre merak ettiniz. Tamam o zaman başlıyorum. Siz kaşındınız…
Proje geliştirirken bazı fonksiyonlarımıza parametre olarak yine bir fonksiyon vermek isteyebiliriz. PHP’ye tümleşik gelen dizi fonksiyonlarına bunlara örnek verilebilir. Buna rağmen öyle bir an gelir ki; “burada şöyle bir callback olsa çok iyi gider be!” dersiniz. Bu yazı evde nasıl kendi lezzetli callback fonksiyonlarınızı yapabileceğini anlatıyor.
Öncelikle ne yapacağızı kafamızda kuralım. Çeşitli örnekler olmasına rağmen kolay anlaşılması adına konuyu diziler üzerinden anlatmanın daha faydalı olacağını düşünüyorum. Örnek olarak bir dizideki tüm elemanlara, parametre olarak verilen fonksiyondaki işlemleri yaptıralım. Kodumuz aşağıdaki gibi olacaktır. (Kod PHP 8 ile yazılmıştır.)
$array = [1, 2, 3, 4, 5, 6];
function doWhatYouWant(callable $callback, int|float ...$arrayElements)
{
$newArray = [];
foreach ($arrayElements as $key => $value) {
$newArray[$key] = $callback($value);
}
return $newArray;
}
$doubledArray = doWhatYouWant(function ($element) {
return $element * 2;
}, ...$array);
print_r($doubledArray);
Kodun çıktısı şu şekilde olacaktır. Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 [4] => 10 [5] => 12 )
Şimdi koda bir göz gezdirelim. doWhatYouWant
fonksiyonun ilk parametresi, ikinci parametrede aldığımız elemanları yapılacak işlemi belirleyen fonksiyondur. Bu fonksiyonda ikinci parametrede alınan tüm işlemler için ilk pametredeki fonksiyonun uygulanıp geriye dönen değerin oluşturduğumuz yeni bir diziye eklendiğini görüyorsunuz.
Bu kodun hemen aşağısına baktığınızda doWhatYouWant
fonksiyonumdan gelen değeri doubledArray
adlı bir değişkene aktardığımı fark edeceksiniz. Ben örnek olarak birinci parametreye gelen her elemanı iki ile çarpıp sonucu dönecek bir fonksiyon verdim. İkinci elemanda bu bu elemanların bulunduğu dizi oluyor. Canım başka bir bir işlem yapmak isteseydi, sadece birinci parametredeki fonksiyonumu değiştirmem yeterli olacaktı.