Magento 2 instanciant les classes via l'usine de gestion d'objets
-
12-12-2019 - |
Question
Dans magento 2, les classes sont instanciées à l'aide d'une usine de gestion d'objets : \Magento\Framework\ObjectManager\Factory\Factory::create()
.
Jusqu'ici tout va bien.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 transmis au constructeur pour DI et une fois les arguments 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 est-ce long switch
déclaration?Pourquoi ne pas utiliser directement le code du default
bifurquer?
Ou pourquoi arrêter le case
à 8?Pourquoi pas 5 ou 10 ou 127 ?
La solution
La raison est la performance.L'instanciation via new 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é.
Autres conseils
Le gain de performances est presque invisible.Lorsque j'essaye d'instancier 1000000 objets avec les 2 méthodes, voici le résultat :
J'utilise la version Magento 2 Beta et PHP (voir ci-dessous)
PHP 5.6.12-1 + Deb.Sury.org ~ Trusty + 1 (CLI) Copyright (C) 1997-2015 Le groupe PHP Zend Engine V2.6.0, Copyright (C) 1998-2015 Zend Technologies avec Zend Opcache V7.0.6 -Dev, Copyright (C) 1999-2015, par Zend Technologies avec Xdebug V2.3.2, Copyright (C) 2002-2015, par Derick Rethans
Pour faire ce test, j'ai utilisé ceci scénario