En PHP, il y a des avantages à utiliser forward_static_call_array () au lieu de call_user_func_array () lorsque vous appelez dynamiquement une méthode statique?

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

  •  23-09-2019
  •  | 
  •  

Question

Plus précisément, est l'un plus efficace que l'autre?

Était-ce utile?

La solution

Il y a au LEAT deux différences entre forward_static_call_array et call_user_func_array :

  • La première existe que depuis PHP 5.3
  • La première doit être appelée à l'intérieur d'une classe

Après cela, je suppose qu'il ya une différence qui est lié à la liaison statique tardive, qui a été introduit avec PHP 5.3.


En fait, si vous regardez de plus près l'exemple donné, il semble être exactement:. Le « contexte » de la classe à l'intérieur que vous utilisez forward_static_call_array est « maintenu », dans la méthode appelée

Compte tenu de cette partie de code, qui est dérivé de l'exemple suivant:

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

Vous obtiendrez cette sortie:

B
B more,args

i.e.. de la méthode dans la classe A, vous « savez », via le mot-clé static::, que vous êtes « en provenance de B ».


Maintenant, si vous essayez de faire la même chose avec 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'));
    }
}

(le reste du code ne change pas)

Vous obtiendrez cette sortie:

B
A more,args

Notez le sur la deuxième ligne! Avec forward_static_call_array, vous n'avez pas reçu , mais B .

C'est la différence: forward_static_call_array transmet le contexte statique à la méthode qui est appelée, alors que call_user_func_array ne pas

.


A propos de votre question d'efficacité: je ne sais pas - vous auriez à référence; mais c'est vraiment pas le point. le point est que ces deux fonctions ne font pas la même chose

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top