Magento 2 instanciando classes através da fábrica de gerenciadores de objetos


9

Em magento 2 as aulas são instanciado usando uma fábrica de gerenciador de objetos: \Magento\Framework\ObjectManager\Factory\Factory::create().
Até agora, goo. Mas há algo que eu não entendo aqui.
Após verificar se não há referências circulares nos argumentos que devem ser passados ​​para o construtor para DI e depois que os argumentos são determinados, existe o seguinte ( $argssão os argumentos que devem ser passados ​​para o construtor):

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

Por que essa longa switchdeclaração? Por que não usar diretamente o código da defaultfilial?
Ou por que parar caseno 8? Por que não 5, 10 ou 127?


código de cama muito
Keyul Shah 03/09/14

11
@KeyulShah. Pode ser, mas tenho quase certeza de que há uma razão por trás disso.
Marius

Respostas:


11

O motivo é o desempenho. A instanciação através do novo é um pouco mais rápida que a reflexão. Como a maioria das classes possui menos de 8 argumentos, essa opção abrange a maioria dos casos.

Talvez seja removido.


11
Obrigado pela resposta. Devo dizer que estou um pouco decepcionado. Eu estava esperando algo chique. :)
Marius

11
Desempenho não é razão suficiente? :)
Anton Kril

3
Além disso, caso não esteja claro a partir da resposta, vale a pena uma implementação um pouco mais rápida em algo que acontece muito (por exemplo, instanciar um objeto).
Alan Storm

11
@AntonKril. Eu não estava falando sobre os motivos. Eu estava esperando uma resposta elegante como "Porque fazemos dessa maneira, sua cerveja nunca fica quente" ou algo assim. Mas acho que o "desempenho" fará isso por enquanto. Fique perto, por favor. outras questões filosóficas se seguirão nos próximos dias. :)
Marius

6

O ganho de desempenho é quase invisível. Quando tento instanciar 1000000 objetos com os 2 métodos, eis o resultado:

insira a descrição da imagem aqui

Estou usando a versão Magento 2 Beta e PHP (veja abaixo)

PHP 5.6.12-1 + deb.sury.org ~ confiável + 1 (cli) Copyright (c) 1997-2015 O PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies com Zend OPcache v7.0.6 -dev, Copyright (c) 1999-2015, da Zend Technologies com Xdebug v2.3.2, Copyright (c) 2002-2015, de Derick Rethans

Para fazer esse teste, usei esse script


Bem ... Anton disse que é "um pouco mais rápido". Qual é :). Mas de qualquer maneira ... + 1 para o perfil.
Marius

Este código foi adicionado há muito tempo. Foi testado no PHP 5.3. Em versões posteriores, a diferença se tornou menos visível, por isso mencionei na minha resposta que esse código pode ser removido posteriormente.
Anton Kril 16/01

@AntonKril Em vez disso, você aumentou até 15 parâmetros ? ;-)
Fabian Schmengler
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.