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 ( $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 essa longa switch
declaração? Por que não usar diretamente o código da default
filial?
Ou por que parar case
no 8? Por que não 5, 10 ou 127?
magento2
magento-2.0
Marius
fonte
fonte
Respostas:
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.
fonte
O ganho de desempenho é quase invisível. Quando tento instanciar 1000000 objetos com os 2 métodos, eis o resultado:
Estou usando a versão Magento 2 Beta e PHP (veja abaixo)
Para fazer esse teste, usei esse script
fonte