Sihirli PHP call_user_func ve call_user_method

3

Tarih : 18-11-2009 | Yazan : Hüseyin Bora | Kategori : PHP

PHP de kodlarken yapılan kolaylıklardan yararlanmama hatalarından biride requesten gelen parametrelere göre uzayan switch case ve else if yapılarıdır.
Bunu pek çok php betiğinde görürsünüz hatta en sık yapılardan biridir.
Temel amaç $_REQUEST[“page”] gibi bir veriye göre işlemi belirlemektir.

Çoğu PHP’ci bu işlemi şöyle yapar.

$param = $_REQUEST[“param”];

switch ($param) {

case “ekle”:
ekle()

break;

case “sil”:
sil()

break;

case “duzenle”:
duzenle();

break;

default:
listele();
}

Bu switch işlem yapılabilecek parametre sayısına göre uzar gider çoğu zaman benzer şekilde üç case ile bitmez. Bu yaklaşımın diğer bir olumsuz yönü de betiğe yeni bir özellik eklendiğinde switch ifadesine yeni bir case in eklenmesi gerektiğidir.

Örneğimizi call_user_func kullanarak yapalım,listele duzenle,sil fonksiyonlarının daha önceden yazıldığı düşünerek.

function ekle(){
echo " kayıt";
}
function duzenle(){
echo "düzenle";
}
...

Şimdi call_user_func fonksiyonunu kullanalım.

$param = $_REQUEST[“param”];

if(function_exists($param))
call_user_func($param);

else

listele();

kodlarımızın açıklamasını yapacak olursak adres satırından işlem bilgisi param alınınarak bir fonksiyonu işletmek için

Örnek localhost.com?param=ekle

eğer ekle fonksiyonu mevcutsa bu fonksiyonu işletiyoruz eğer paramdan gelen fonksiyon mevcut değilse listele fonksiyonunu çağırıyoruz.

call_user_func bir fonksiyonu call_user_method ise bir sınıfın üye metodunu işletir.
Örneğin ekle,duzenle,sil,listele metotlarının Kayıt sınıfı içerisinde olduğunu varsayalım.

class kayıt{
function save($param){
}
function delete($param){
}
function update($param){
}
function liste($param){
}
}

call_user_method kullanımı

$param = $_REQUEST[“param”];
$kayıt = new Kayıt();

if(method_exists($kayıt,$param))
call_user_method($param, $kayıt)

else

call_user_method(“liste”, $kayıt)

Örnektende anlaşılacağı gibi switch case ifadeleri ile onlarca uzayan giden satırlarla karşılık örnekteki kullanım daha verimlidir. Bu sayede yeni bir işlem eklendiğinde de switch case ifadesindeki gibi bir düzenleme yapmaya ihtiyaçda duyulmaz.

Son olarak php 5.3 den sonrası için call_user_method için uyarı alabilirsiniz php5.3 ve üst versiyonlar için call_user_method nesnel olarak kulanabilirsiniz.

Kullanımı aşağıdaki gibidir.

call_user_func(array(Çalıştırılacak Nesne, Nesnenin Metodu),Parametreler);

Şimdi son örenğimizi nasıl kullanıcaüımıza bakalım

$param = $_REQUEST[“param”];
$kayıt = new Kayıt();

if(method_exists($kayıt,$param))
call_user_func(array($kayıt, $param));

else

call_user_func(array($kayıt,"liste"));
call_user_method
Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

Facebook yorumları:

Yorumlar (3)

Cok güzel bir konuya deginmissiniz ama aciklama kisitli olmus.

Elinize saglik.

cok faydali bir functiona benziyor ama arkadasinda dedigi gibi örnek cok yetersiz,biraz daha genis bir örnek verseydiniz cok memnun olurdum,genede tsk.ederim

Bende konu icin tsk ederim ama arkadaslarin degindigi gibi kisitli bir aciklama olmus bu sınıfla site yonetimleri yazımı cok kısa surebilir rica etsek konu hakkında biraz daha aciklama yapabılırmısınız yada kullanabılecegımız bir kaynak belirtirmisiniz

Yorum yaz