Magento 2 creación de instancias de clases a través de la fábrica del administrador de objetos

magento.stackexchange https://magento.stackexchange.com//questions/34579

  •  12-12-2019
  •  | 
  •  

Pregunta

En magento 2, las clases se crean instancias utilizando una fábrica de administrador de objetos: \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 deben pasarse al constructor para DI y después de determinar los argumentos, aparece 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 tan largo? switch ¿declaración?¿Por qué no utilizar directamente el código del default ¿rama?
¿O por qué detener el case ¿a las 8?¿Por qué no 5, 10 o 127?

¿Fue útil?

Solución

La razón es el rendimiento.La creación de instancias a través de new es un poco 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.

Quizás lo eliminen.

Otros consejos

La ganancia de rendimiento es casi invisible.Cuando intento crear una instancia de 1000000 objetos con los 2 métodos, aquí está el resultado:

enter image description here

Estoy usando Magento 2 Beta y la versión PHP (ver más abajo)

PHP 5.6.12-1+Deb.Sury.org ~ Trusty+1 (CLI) Copyright (C) 1997-2015 El motor PHP Group Zend Engine v2.6.0, Copyright (C) 1998-2015 Zend Tecnologías con Zend Opcache v7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.6 -Dev, Copyright (C) 1999-2015, por Zend Technologies con Xdebug v2.3.2, Copyright (C) 2002-2015, por Derick Rethans

Para hacer esta prueba, utilicé esto guion

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top