PHP ile Dinamik Method Çağrıları

October 2, 2008

Dinamik method çağrısı, parametrelerinin uzunluğunu bilmediğiniz bir methoda çağrı yapmak için kullanılır. Hangi durumlarda buna ihtiyacımız olur derseniz; MVC’ler buna iyi bir örnektir. Yazımın ikinci bölümünde söz edeceğim dinamik obje yaratma durumlarındada çok işe yararlar. Peki az laf çok örnek yaparak konuyu özetleyeyim.

Diyelim ki;

http://example.com/blog/categories/200810/general

yukarıdaki gibi bir çağrıyı doğru şekilde yönlendirmemiz gerekiyor. İşte böyle bir durumda dinamik method çağrısı çok işe yarar.

class blog extends controller

{

function categories($date, $cat_name)

{….}

}

Peki bunu nasıl yapıyoruz?

Yukarıdaki 4 fonksiyon adı (anahtar kelime) yeterlidir sanırım. Peki yukarıdaki örneğimizde bu çağrı nasıl yapılıyor ona bakalım.

URL parse edildikten sonra;

call_user_method_array($method, $class, $args);

method çağrısı ile gerçekleştirebilirsiniz.

call_user_xxx methodlarını __construct methodu için kullanamazsınız. Yani olurda benim gibi dinamik olarak obje yaratmak isterseniz bu methodlar işe yaramaz. İşte bu durumlarda işinize yarıyacak bir method örneği vereceğim.

$db->comment = using(“dal.comment”, $db);

Biraz methodun ne yaptığını açıklamam gerekir sanırım. Biliyorsunuz PHP 5.3 ile beraber namespace kavramı hayatımıza girdi. Kendi geliştirmekte olduğum framework’te import işlemleri için çok basit bir şekilde çalışan bir namespace sistemi oluşturdum. using ile ise; aynı isime ait iki sınıf, kazaren çakışması durumunu engellemek için yazmıştım. İlk parametre sınıfın paket bilgisi ikincisinde ise, __construct methodunun aldığı parametreler söz konusu. İşte bu işi call_user_XXX kullanmadan yapmanın yolu;

    function using($class)
    {
        require_once(_get_class_path($class));
        $class_name = _find_class_name($class);

        $args_count = func_num_args();

        $args = "";
        for ($i = 1; $i < $args_count; $i++)
        {
            eval("\$arg_{$i} = func_get_arg($i);");
            $args .= "\$arg_{$i},";
        }
        $args = rtrim($args, ",");

        eval("\$obj = new $class_name($args);");
        return $obj;
    }