Magento 2 instanziiert Klassen über die Objektmanager-Factory

9

In Magento 2 werden die Klassen mithilfe einer Objektmanager-Factory instanziiert : \Magento\Framework\ObjectManager\Factory\Factory::create().
So weit so gut. Aber es gibt etwas, das ich hier nicht verstehe.
Nachdem überprüft wurde, ob die Argumente keine Zirkelverweise enthalten, die an den Konstruktor für DI übergeben werden sollen, und nachdem die Argumente ermittelt wurden, gibt es Folgendes ( $argssind die Argumente, die an den Konstruktor übergeben werden sollen):

    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);
    }

Warum ist diese lange switchAussage? Warum nicht direkt den Code aus der defaultFiliale verwenden?
Oder warum um case8 aufhören ? Warum nicht 5 oder 10 oder 127?

Marius
quelle
sehr
Bettcodierung
1
@ KeyulShah. Könnte sein, aber ich bin mir fast sicher, dass es einen Grund dafür gibt.
Marius

Antworten:

11

Der Grund ist die Leistung. Die Instanziierung durch Neues ist etwas schneller als die Reflexion. Die meisten Klassen haben weniger als 8 Argumente, daher deckt dieser Schalter die meisten Fälle ab.

Vielleicht wird es entfernt.

Anton Kril
quelle
1
Danke für die Antwort. Ich muss sagen, ich bin ein bisschen enttäuscht. Ich hatte etwas Besonderes erwartet. :)
Marius
1
Leistung ist nicht Grund genug? :)
Anton Kril
3
Falls sich aus der Antwort nicht ergibt, lohnt sich eine etwas schnellere Implementierung in etwas, das häufig vorkommt (dh ein Objekt instanziiert).
Alan Storm
1
@AntonKril. Ich habe nicht über die Gründe gesprochen. Ich hatte auf eine ausgefallene Antwort wie "Weil wir es so machen, wird Ihr Bier nie warm" oder so etwas gehofft. Aber ich denke, "Leistung" wird es vorerst tun. Bleib bitte in der Nähe. Weitere philosophische Fragen werden in den nächsten Tagen folgen. :)
Marius
6

Der Leistungsgewinn ist nahezu unsichtbar. Wenn ich versuche, 1000000 Objekte mit den beiden Methoden zu instanziieren, ist hier das Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Ich verwende Magento 2 Beta und PHP-Version (siehe unten)

PHP 5.6.12-1 + deb.sury.org ~ trusty + 1 (cli) Copyright (c) 1997-2015 Die PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies mit Zend OPcache v7.0.6 -dev, Copyright (c) 1999-2015, von Zend Technologies mit Xdebug v2.3.2, Copyright (c) 2002-2015, von Derick Rethans

Um diesen Test durchzuführen, habe ich dieses Skript verwendet

Michael R.
quelle
Nun ... Anton sagte, es sei "etwas schneller". Was es ist :). Aber trotzdem ... + 1 für die Profilerstellung.
Marius
Dieser Code wurde vor langer Zeit hinzugefügt. Es wurde auf PHP 5.3 getestet. In späteren Versionen wurde der Unterschied weniger sichtbar, weshalb ich in meiner Antwort erwähnte, dass dieser Code möglicherweise später entfernt wird.
Anton Kril
@AntonKril Stattdessen haben Sie es auf 15 Parameter gepumpt ? ;-)
Fabian Schmengler