PHP Callback Fonksiyon Kullanımı
Hepinize merhaba dostlarım 😊. Bu yazımda sizlere PHP programlama dili üzerinde callback fonksiyonlardan bahsedeceğim. Daha öncesinde bunu javascript programlama dili üzerinde göstermiştim. Okumayan dostlarım için buraya linkini bırakıyorum. Rahat rahat göz atabilirsiniz
Callback fonksiyon nedir diye genel olarak bir bakacak olursak dostlarım şöyle anlatayım sizlere. Biz bir fonksiyon oluşturduk diyelim. Bu fonksiyonu çalıştırdık ve bu fonksiyondaki işlemler tamamlanınca başka bir fonksiyonun çalışmasını istediğimiz durumlar olabilir. İşte bu durumda kullanacağımız fonksiyonlar callback fonksiyon olarak geçer dostlarım.
Genel olarak nerelerde kullanılır diye merak ediyorsanız OOP mimarisinde Route işlemleri olsun veya daha basite indirgememiz gerekirse örnek veriyorum array_map() gibi PHP programlama dili üzerindeki bize sunulan ufak tefek fonksiyonlarda kullanılabilir. Ben bu yazımda callback() fonksiyonları OOP mimarisi üzeriden anlatacağım. Sözü daha fazla uzatmadan hemen konumuza geçelim istiyorum :)
CALLBACK FONKSİYON OLUŞTURMA
Eveeet dostlar artık geldik ilk başlığımıza ve PHP programlama dili üzerindeki ilk callback fonksiyonumuzu oluşturma işlemimize. Öncelikle htdocs altında php-callback diye bir klasör oluşturalım ve onun içinde index.php dosyası oluşturalım. Bu başlıktaki ve diğer başlıklardaki bütün örnekleri bu dosya üzerinden gerçekleştirelim. Klasörümüzü ve dosyamızı oluşturduktan sonra
<?php
class Start{
public static function selamla($callback){
if (is_callable($callback)){
call_user_func($callback);
}
}
}
Start::selamla(function (){
echo "Merhaba";
});
şeklinde kodlarımızı yazalım. Burada ne yaptık diye merak ediyorsanız dostlarım adım adım anlatayım sizlere
- Start isimli bir class oluşturduk ve bunun içerisine statik olarak tanımladığımız selamla methodunu yerleştirdik. Daha sonra $callback isimli bir parametre almasını sağladık
- Sonrasında içerisine bir if şartı koyup bu $callback parametresi dışşarıdan çağrılabilir mi ( is_callable() ) şeklinde kontrol yaptırdık.
- Şart sağlandığı taktirde içerisinde call_user_func($callable) olarak oluşturduğumuz ve dışarıdan da çağıracağımız callback fonksiyonumuzun çalışmasını sağladık.
- Daha sonra da bu class'ımızı ve içerisindeki selamla() methodumuzu bir callback fonksiyon göndererek çağırma işlemini ve ekranımıza "Merhaba" yazma işlemini gerçekleştirmek istedik
şeklinde sürecimiz işledi dostlarım. Bu kodu local sunucumuz üzerinde test ettiğimiz zaman karşımıza çıkacak olan sonuç
Merhaba
şeklinde olacaktır. Bütün işlemler bu kadar basit dostlarım. Çok zor bir yanı yok :). Gelelim bir diğer başlığımıza
TEK PARAMETRE GÖNDERME
Artık zaman gelecek callback fonksiyonumuzu kuru kuruya kullanmak yerine parametre gönderme ve bu parametreleri işleme durumlarıyla da karşılaşacağız. Peki bu işlemleri nasıl yapacağız ? İşte bunun cevabını görmek için hemen kodlama kısmımıza geçelim.
<?php
class Insan{
public static function cinsiyet($cinsiyet,$callback){
if (is_callable($callback)){
$sonuc = ($cinsiyet==1) ? "Erkek" : "Bayan";
call_user_func($callback,$sonuc);
}
}
}
Insan::cinsiyet(1,function ($data){
echo "Cinsiyetiniz: ".$data;
});
şeklinde kodlarımızı yazdık dostlarım. Bir önceki başlıktaki gibi süreç hemen hemen aynı. Buradaki tek fark sadece $callback parametresi yerine dışarıdan bir parametre daha gönderip bunu class içerisindeki methodumuzda analiz edip ve sonrasında bu veriyi işleyip call_user_func() fonksiyonunda 2. parametre olarak parametreyi gönderiyoruz. Gönderdiğimiz parametre ise bizim aşağıda yazdığımız Insan::cinsiyet() komutundaki yazdığımız callback fonsiyonumuza bir parametre olarak gönderiliyor ve ekranımıza Insan class'ı içerisindeki cinsiyet() methodunun içerisinde işlenen veri yazılıyor. Hemen local sunucumuzu çalıştırdığımızda ekran çıktımıza baktığımızda karşımıza
Cinsiyetiniz: Erkek
şeklinde bir sonucun geldiğini görüyoruz. İşte dostlarım callback fonksiyonlarımızda parametreler ile çalışmak da aynen bu şekilde. Gelelim bir diğer başlığımıza
TEK PARAMETRE GÖNDERME (DİZİ İŞLEMLERİ)
Aslında bu kısmın bir önceki kısımdan hemen hemen bir farkı yok diyebiliriz dostlarım. Normalde birden fazla özellik göndermek istediğimiz durumlarda yeri geliyor dizi kullanıyoruz bunu siz de biliyorsunuz. İşte bu durumda değişen pek bir şey yok dostlarım hemen hemen yukarıdaki örneğin aynısını kullanıyoruz. Nasıl Ki ? Diye merak ediyorsunuzdur. O halde sözü daha fazla uzatmadan hemen kodlama kısmına geçişimizi yapalım
<?php
class ProgrammingLanguage{
public static function diller($callback,$diller = array()){
if (is_callable($callback) && is_array($diller)){
call_user_func($callback,$diller);
}
}
}
$language = ["PHP","JavaScript","Python","Go","Ruby"];
ProgrammingLanguage::diller(function ($data){
foreach ($data as $dt){
echo $dt."<br>";
}
},$language);
şeklinde kodlarımızı yazdık. Artık fark etmişsinizdir bir önceki işlemin hemen hemen aynısı. Yalnız iki fark var bunlardan birincisi gönderdiğimiz parametre normal bir değişken değil yani bir dizi (array), ikinci işlem ise Class içerisindeki oluşturduğumuz statik fonksiyonumuz içerisindeki if koşulundaki bu değişkenin bir dizi (array) olup olmadığını kontrol etme işlemi yani is_array() methodumuzdur. Onun harici hiçbir farklı işlem yok. Kodları yazdıktan sonra aşağıda çağırdığımızda haliyle gelen parametre de bir dizi (array) olacağı için bunu foreach döngüsü ile teker teker dönüp ekranımıza bastığımızda karşımıza çıkacak olan sonuç
PHP
JavaScript
Python
Go
Ruby
şeklinde olacaktır dostlarım. İşlemlerin gayet basit ve hızlı olduğunu görüyorsunuz. İlk başlarda biraz karmaşık gelse de zamanla oturacaktır zihninizde bu konu ben inanıyorum :). Bu başlık da tamamsa gelelim bir sonraki başlığımıza
BİRDEN FAZLA PARAMETRE GÖNDERME
Eveeeet. Artık zamanı gelecek tek parametreler veya tek parametre içerisinde dizi kullanıp birden fazla özellik göndermemiz de yetmeyecek. Bütün bu işlemleri birden fazla parametre gönderip bunları işleme durumlarımızla da karşılaşacağız. Peki bu işlemlerde nasıl mı yol izleyeceğiz ? İşte bunun cevabını öğrenmeniz için tam yerindeyiz. O halde sözü daha fazla uzatmadan hemen kodlama kısmımıza geçişimizi yapalım.
<?php
class Araba{
public static function ozellik($callback,$arac = array()){
if (is_callable($callback) && is_array($arac)){
call_user_func_array($callback,array($arac['marka'],$arac['model'],$arac['motor'],$arac['beygir']));
}
}
}
$arac = [
"marka"=>"Volkswagen",
"model"=>"Polo",
"motor"=>"1.6",
"beygir"=>"310"
];
Araba::ozellik(function ($marka,$model,$motor,$beygir){
echo "Araç Markası: ".$marka.", Model: ".$model.", Motor: ".$motor.", Beygir: ".$beygir;
},$arac);
şeklinde kodlarımızı yazdık dostlarım. Fark ettiyseniz if koşulu içerisinde call_user_func() fonksiyonu yerine call_user_func_array() isimli bir fonksiyon kullandık. Bunların arasında çok yüksek seviyede bir fark yok dostlarım. Call_user_func() fonksiyonu callback fonksiyonumuza tek parametre gönderme işlemini gerçekleştirirken call_user_func_array() fonksiyonumuz ise callback fonksiyonumuza birden fazla paraemtre göndermemiz için bize yardımcı olur. Temel farkı anladığımıza ve kodlarımızı yazdığımıza göre local sunucumuz üzerinde kodlarımızı çalıştıralım ve ekran çıktımıza da baktığımızda
Araç Markası: Volkswagen, Model: Polo, Motor: 1.6, Beygir: 310
şeklinde bir sonuç çıktısının bizi karşıladığını göreceğiz. Gönderdiğimiz bütün parametreler sorunsuz bir şekilde çalışmış ve ekranımıza basılmış şekildedir dostlarım.Zor bir yanı gördüğünüz gibi yok işlem tamamen basit. Bu başlığı da anladığımıza göre bir diğer başlığımıza gelelim
ROUTE MANTIĞI
Bu konuyu yazımın başında anlatmıştım aslında. Callback fonksiyonları biraz derinden incelersek (MVC frameworkler'i incelediğimizde) rotasyon kısımlarında oldukça sık bir şekilde callback fonksiyonları rahatlıkla görebiliriz. Bizim sayfa üzerinden gönderdiğimiz uri ye göre sayfalarımızın ekrana getirilmesi yani rotasyon işlemlerinde aslında bu callback fonksiyonlarımız çalışır. Pekiiii bu işlem nasıl oluyor yani backend kısmında neler dönüyor bunları gelin ufak bir örnek üzerinden inceleyelim. Öncelikle yazacağımız route için bir .htaccess yazmamız gereklidir (bu kısım kafanızı karıştırmasın ileriki zamanlarda bununla ilgili makale geldiğinde anlayacaksınız). Hemen proje klasörümüzde .htaccess dosyası oluşturalım ve içerisine
RewriteEngine On
RewriteRule ^(php-callback/[0-9a-zA-Z-_/])* index.php [QSA]
şeklinde kodlarımızı yazalım. Burada proje klasörümüz olan php-callback üzerinde numerik veya string herhangi bir veri gelirse bunu index.php üzerinden işle diye komut veriyoruz. Bu kısmı yazdıktan sonra ise gelelim index.php dosyamıza. Bu kısımda ise
<?php
class Route{
public static function get($callback,$uri){
if (is_callable($callback)){
call_user_func($callback,$uri);
}
}
}
$sonuc = explode("/",$_SERVER['REQUEST_URI'])[2];
Route::get(function ($data){
if ($data=="" || $data=="anasayfa"){
echo "Şu Anki Bulunduğunuz Sayfa: Anasayfa";
}else{
echo "Şu Anki Bulunduğunuz Sayfa: ".ucfirst($data);
}
},$sonuc);
şeklinde kodlarımızı yazalım. Bizim sayfa üzerine attığımız uri isteklerinde bunları süzme işleminden geçecek ve ekranımıza hangi sayfada oluduğumuzu bastırma işlemi yaptıracağız. Kodlara bakacak olursanız tek parametre gönderme işlemiyle birebir aynı :). Şimdi kodlarımızı yazdığımıza göre gelelim artık bu kodlarımızın test işlemine. O halde vakit kaybetmeden hemen test işlemlerine başlayalım. local sunucumuz hali hazırda arka planda çalışırken browser arama çubuğuna gelip
http://localhost/php-callback/
veya
http://localhost/php-callback/anasayfa
yazdığımız zaman ekranımıza çıkacak olan sonucumuzun
Şu Anki Bulunduğunuz Sayfa: Anasayfa
şeklinde ekrana rahatlıkla basıldığını rahatlıkla görebiliriz. Anasayfa haricinde mesela
http://localhost/php-callback/hakkimda
şeklinde bir istek yaptığımızda ise ekranımıza gelecek olan çıktının
Şu Anki Bulunduğunuz Sayfa: Hakkimda
şeklinde olduğunu çok rahat bir şekilde ekranımıza bastırıldığına şahit oluruz :). İşte dostlarım MVC frameworkler üzerinde route işlemleri tam olarak bu şekilde işlediğini rahatıkla söyleyebiliriz. Gelen uri istekleri doğrultusunda artık gideceği yeri vs falan rahatlıkla ayarlayabiliriz yani kontrol tamamen bizim elimizde :).
UFAK BİR ÖRNEK
Eveeeeet artık callback fonksiyon oluşturma ile ilgili bilgi sahibi olduğumuza göre gelelim artık ufak bir örnek yapmaya. Burada yapacağımız işlem tek parametre gönderimi üzerine olsun ve bir dizi içerisinde isimleri gönderelim. Daha sonra ise bu gönderdiğimiz diziyi callback fonksiyonumuz üzerinde yakalayıp foreach döngüsü ile dönelim ve ekranımıza bastıralım. Bunun için öncelikle kodlama kısmına gelelim ve
<?php
class My_Bests{
public static function listele($callback,$names = array()){
if (is_callable($callback) && is_array($names)){
call_user_func($callback,$names);
}
}
}
$datalar = ["Zafer YILDIZ","Emrullah TANIMA","Muhammed Fatih BAĞCIVAN","Aylin DURAN"];
My_Bests::listele(function ($datalar){
foreach ($datalar as $data){
echo $data."<br>";
}
},$datalar);
şeklinde kodlarımızı yazdık. Local sunucumuz üzerinden kodlarımızı çalıştırdığımızda ise ekranımıza
Zafer YILDIZ
Emrullah TANIMA
Muhammed Fatih BAĞCIVAN
Aylin DURAN
şeklinde çıktımızın rahatlıkla geleceğini göreceğiz :). Bütün işlemlerimiz bu kadar basit.
Eveeeet dostlarım 😊. Bu yazımda sizlere callback fonksiyon nedir, nerelerde kullanılır, PHP programlama dili üzerinde callback fonksiyon nasıl oluşturulur bunlardan elimden geldiğince dilim döndüğünce bahsetmeye çalıştım ve konuyu pekiştirmek için en son kısımda bir örnek yaptım. Umarım faydalı olmuşumdur. Eksik veya hatalı bir anlatım yapmış isem benimle iletişime geçmekten çekinmeyin :). Konu başlarda biraz karmaşık veya zor gelmiş olabilir dostlarım anlıyorum. Bu aşamada yapmanız gereken tek şey her yazımda da dediğim gibi "İstikrarlı ve Azimli Olmalısınız, Bolca Pratik Yapmalısınız". Bu dediklerimi hayat felsefeniz yaptığınız sürece başarı sizler için kaçınılmaz olacaktır :)
Hayallerinizi gerçekleştirmeniz ve güzel yerlere gelmeniz dileklerimle... İyi çalışmalar dilerim :)
Yazar Hakkında
Kendi Halinde Bir Backend Developer