Dans magento 2 classes sont instancié à l' aide d' une usine de gestionnaire d'objets: \Magento\Framework\ObjectManager\Factory\Factory::create()
.
Jusqu'à présent, goo. Mais il y a quelque chose que je ne comprends pas ici.
Après avoir vérifié s'il n'y a pas de références circulaires dans les arguments qui doivent être passés au constructeur pour DI et après que les arguments sont déterminés, il y a ceci ( $args
sont les arguments qui doivent être passés au constructeur):
switch (count($args)) {
case 1:
return new $type($args[0]);
case 2:
return new $type($args[0], $args[1]);
case 3:
return new $type($args[0], $args[1], $args[2]);
case 4:
return new $type($args[0], $args[1], $args[2], $args[3]);
case 5:
return new $type($args[0], $args[1], $args[2], $args[3], $args[4]);
case 6:
return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]);
case 7:
return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6]);
case 8:
return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7]);
default:
$reflection = new \ReflectionClass($type);
return $reflection->newInstanceArgs($args);
}
Pourquoi cette longue switch
déclaration? Pourquoi ne pas utiliser directement le code de la default
succursale?
Ou pourquoi arrêter le case
8? Pourquoi pas 5 ou 10 ou 127?
magento2
magento-2.0
Marius
la source
la source
Réponses:
La raison en est la performance. L'instanciation par le nouveau est légèrement plus rapide que la réflexion. La plupart des classes ont moins de 8 arguments, ce commutateur couvre donc la plupart des cas.
Peut-être qu'il sera supprimé.
la source
Le gain de performance est presque invisible. Lorsque j'essaie d'instancier 1000000 objets avec les 2 méthodes, voici le résultat:
J'utilise la version bêta et PHP de Magento 2 (voir ci-dessous)
Afin de faire ce test, j'ai utilisé ce script
la source