In PHP, gibt es Vorteile bei der Verwendung forward_static_call_array () anstelle von call_user_func_array (), wenn dynamisch eine statische Methode aufrufen?
Frage
Insbesondere ist ein effizienter als die anderen?
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