Magento 2 instanciant les classes via la fabrique de gestionnaire d'objets

9

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 ( $argssont 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 switchdéclaration? Pourquoi ne pas utiliser directement le code de la defaultsuccursale?
Ou pourquoi arrêter le case8? Pourquoi pas 5 ou 10 ou 127?

Marius
la source
codage très lit
Keyul Shah
1
@KeyulShah. C'est possible, mais je suis presque sûr qu'il y a une raison à cela.
Marius

Réponses:

11

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é.

Anton Kril
la source
1
Merci d'avoir répondu. Je dois dire que je suis un peu déçu. Je m'attendais à quelque chose de fantaisiste. :)
Marius
1
La performance n'est pas une raison suffisante? :)
Anton Kril
3
De plus, au cas où cela ne serait pas clair dans la réponse, une implémentation légèrement plus rapide dans quelque chose qui se produit souvent (c.-à-d. Instancier un objet) en vaut la peine.
Alan Storm
1
@AntonKril. Je ne parlais pas des raisons. J'espérais une réponse de fantaisie comme "Parce que nous le faisons de cette façon, votre bière ne se réchauffera jamais" ou quelque chose comme ça. Mais je suppose que "performance" le fera pour l'instant. Restez près s'il vous plaît. d'autres questions philosophiques suivront dans les prochains jours. :)
Marius
6

Le gain de performance est presque invisible. Lorsque j'essaie d'instancier 1000000 objets avec les 2 méthodes, voici le résultat:

entrez la description de l'image ici

J'utilise la version bêta et PHP de Magento 2 (voir ci-dessous)

PHP 5.6.12-1 + deb.sury.org ~ trusty + 1 (cli) Copyright (c) 1997-2015 The PHP Group 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

Afin de faire ce test, j'ai utilisé ce script

Michael R
la source
Et bien ... Anton a dit que c'était "légèrement plus rapide". Lequel c'est :). Mais bon ... + 1 pour le profilage.
Marius
Ce code a été ajouté il y a longtemps. Il a été testé sur PHP 5.3 Sur les versions ultérieures, la différence est devenue moins visible, c'est pourquoi j'ai mentionné dans ma réponse que ce code pourrait être supprimé plus tard.
Anton Kril
@AntonKril Au lieu de cela, vous l'avez pompé jusqu'à 15 paramètres ? ;-)
Fabian Schmengler