Clases de creación de instancias de Magento 2 a través de la fábrica de Object Manager

9

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 ( $argsson 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 switchdeclaración? ¿Por qué no usar directamente el código de la defaultsucursal?
¿O por qué parar a las case8? ¿Por qué no 5 o 10 o 127?

Marius
fuente
muy codificación de la cama
Keyul Shah
1
@KeyulShah. Podría ser, pero estoy casi seguro de que hay una razón detrás de esto.
Marius

Respuestas:

11

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.

Anton Kril
fuente
1
Gracias por la respuesta. Debo decir que estoy un poco decepcionado. Esperaba algo elegante. :)
Marius
1
El rendimiento no es razón suficiente? :)
Anton Kril
3
Además, en caso de que no esté claro en la respuesta, una implementación un poco más rápida en algo que sucede mucho (es decir, instanciar un objeto) vale la pena.
Alan Storm
1
@AntonKril. No estaba hablando de las razones. Esperaba una respuesta elegante como "Porque lo hacemos así, tu cerveza nunca se calentará" o algo así. Pero supongo que el "rendimiento" lo hará por ahora. Quédate cerca por favor. otras preguntas filosóficas seguirán en los próximos días. :)
Marius
6

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

ingrese la descripción de la imagen aquí

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

PHP 5.6.12-1 + deb.sury.org ~ trusty + 1 (cli) Copyright (c) 1997-2015 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies con Zend OPcache v7.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é este script

Michael R
fuente
Bueno ... Anton dijo que es "un poco más rápido". Cual es :). Pero de todos modos ... + 1 para el perfil.
Marius
Este código fue agregado hace mucho tiempo. Fue probado en PHP 5.3. En versiones posteriores, la diferencia se hizo menos visible, por eso mencioné en mi respuesta que este código podría eliminarse más tarde.
Anton Kril
@AntonKril En cambio, ¿lo bombeaste hasta 15 parámetros ? ;-)
Fabian Schmengler