Magento 2 instanciar classes através do gerenciador de objetos de fábrica
-
12-12-2019 - |
Pergunta
No magento 2 as classes são instanciadas usando um gerenciador de objetos de fábrica: \Magento\Framework\ObjectManager\Factory\Factory::create()
.
Tão longe tão goo.Mas há algo que não entendo aqui.
Depois de verificar se não existem referências circulares nos argumentos que devem ser passados para o construtor para DI e depois os argumentos são determinados não é este ($args
sã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 esta longa switch
declaração?Por que não usar diretamente o código do default
ramo?
Ou por que parar o case
em 8?Por que não 5 ou 10 ou 127?
Solução
O motivo é o desempenho.Instanciação através de novo é um pouco mais rápido do que a reflexão.A maioria das turmas tem menos de 8 argumentos para que essa opção cobre a maioria dos casos.
Talvez ele vai ser removido.
Outras dicas
O ganho de desempenho é quase invisível.Quando eu tento instanciar 1000000 objetos com os 2 métodos, aqui está o resultado :
Estou usando o Magento 2 Beta e a versão do PHP (veja abaixo)
PHP 5.6.12-1+deb.sury.org~fiel+1 (cli) Copyright (c) 1997-2015 O PHP Grupo Zend Motor v2.6.0, Copyright (c) 1998-2015 Zend Tecnologias com Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, pela Zend Technologies com o Xdebug v2.3.2, Copyright (c) 2002-2015, por Derick Rethans
Para fazer esse teste, eu usei esse script