En Magento 2 las clases son instanciados utilizando un administrador de objetos de fábrica: \Magento\Framework\ObjectManager\Factory\Factory::create()
.
Hasta ahora todo bien. Pero hay algo que no entiendo aquí.
Después de verificar si no hay referencias circulares en los argumentos que se deben pasar al constructor para DI y después de que se determinen los argumentos, existe esto ( $args
son los argumentos que se deben pasar al constructor):
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 qué es esta larga switch
declaración? ¿Por qué no usar directamente el código de la default
sucursal?
¿O por qué parar a las case
8? ¿Por qué no 5 o 10 o 127?
magento2
magento-2.0
Marius
fuente
fuente
Respuestas:
La razón es el rendimiento. La creación de instancias a través de nuevas es ligeramente más rápida que la reflexión. La mayoría de las clases tienen menos de 8 argumentos, por lo que este modificador cubre la mayoría de los casos.
Tal vez sea eliminado.
fuente
La ganancia de rendimiento es casi invisible. Cuando trato de instanciar 1000000 objetos con los 2 métodos, aquí está el resultado:
Estoy usando la versión Magento 2 Beta y PHP (ver abajo)
Para hacer esta prueba, utilicé este script
fuente