In PHP, gibt es Vorteile bei der Verwendung forward_static_call_array () anstelle von call_user_func_array (), wenn dynamisch eine statische Methode aufrufen?

StackOverflow https://stackoverflow.com/questions/2343974

  •  23-09-2019
  •  | 
  •  

Frage

Insbesondere ist ein effizienter als die anderen?

War es hilfreich?

Lösung

Es gibt bei leat zwei Unterschiede zwischen forward_static_call_array und call_user_func_array :

  • Die erste existiert erst seit PHP 5.3
  • Die erste muss aus dem Inneren einer Klasse aufgerufen werden

Danach habe ich nehme an, es gibt einige Unterschiede, die Späte statische Bindung verwandt ist, die mit PHP 5.3 eingeführt wurde.


Eigentlich, wenn Sie einen genaueren Blick auf das gegebene Beispiel nehmen, so scheint es zu sein, genau das:. Der „Kontext“ der Klasse in der Sie forward_static_call_array verwenden wird „gehalten“, in der aufgerufenen Methode

In Anbetracht dieser Teil des Codes, die von dem gegebenen Beispiel abgeleitet ist:

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');

Sie finden diese Ausgabe erhalten:

B
B more,args

d. von der Methode in der Klasse A, Sie „wissen“, über das static:: Stichwort, dass Sie „von B kommen“.


Nun, wenn Sie versuchen, die die gleiche Sache mit call_user_func zu tun:

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'));
    }
}

(der Rest des Codes nicht ändern)

Sie finden diese Ausgabe erhalten:

B
A more,args

Beachten Sie die A in der zweiten Zeile! Mit forward_static_call_array, hast du nicht ein A , aber ein B .

Das ist der Unterschied. forward_static_call_array leitet der statische Kontext zu der Methode, die aufgerufen wird, während call_user_func_array nicht


Über Ihre Effizienz Frage: Ich habe keine Ahnung - Sie Benchmarks haben würde; aber das ist wirklich nicht der Punkt. Der Punkt ist, dass diese beiden Funktionen die gleiche Sache nicht tun

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top