Dinamik, statik bir yöntem çağırırken PHP, yerine call_user_func_array ve forward_static_call_array kullanarak herhangi bir avantajları () () var mı?

1 Cevap php

Özellikle, bir başka daha etkilidir?

1 Cevap

Arasındaki iki fark leat vardır forward_static_call_array and call_user_func_array :

  • İlki sadece PHP 5.3 beri var
  • İlki, bir sınıf içinde çağrılmalıdır

Bundan sonra, PHP 5.3 ile tanıtıldı bağlama Geç Statik ile alakalı biraz fark olduğunu varsayalım.


Actually, if you take a closer look at the given example, it seems to be exactly that : the "context" of the class inside which you are using forward_static_call_array is "kept", in the called method.

Bu kod bölümü göz önüne alındığında, bu örnekte de elde edilen var:

class A {
    const NAME = 'A';
    public static function test() {
        $args = func_get_args();
        echo static::NAME, " ".join(',', $args)." \n";      // Will echo B
    }
}

class B extends A {
    const NAME = 'B';
    public static function test() {
        echo self::NAME, "\n";          // B
        forward_static_call_array(array('A', 'test'), array('more', 'args'));
    }
}

B::test('foo');

Bu çıktıyı alırsınız:

B
B more,args

A sınıfı yöntemi, yani sen "B gelen" olduğunuzu, static:: anahtar kelime aracılığıyla, "bilmek".


Now, if you try to do the the same thing with call_user_func :

class B extends A {
    const NAME = 'B';
    public static function test() {
        echo self::NAME, "\n";          // B
        call_user_func_array(array('A', 'test'), array('more', 'args'));
    }
}

(the rest of the code doesn't change)

Bu çıktıyı alırsınız:

B
A more,args

A ikinci satırda Not! forward_static_call_array, bir A alamadım, ama bir B. Ile

İşte fark bu: forward_static_call_array denir yöntemi statik bağlamı iletir, call_user_func_array yok iken.


About your efficiency question : I have no idea -- you'd have to benchmark ; but that's really not the point : the point is that those two functions don't do the same thing.