Magento 2 instanziiert Klassen über die Objektmanager-Factory
-
12-12-2019 - |
Frage
In Magento 2 werden die Klassen mit einer Objektmanager-Factory instanziiert: \Magento\Framework\ObjectManager\Factory\Factory::create()
.
So weit, so gut.Aber da ist etwas, das ich hier nicht verstehe.
Nach der Überprüfung, ob die Argumente, die an den Konstruktor für DI übergeben werden sollen, keine Zirkelverweise enthalten, und nachdem die Argumente ermittelt wurden, gibt es Folgendes ($args
sind 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 das so lang switch
aussage?Warum nicht direkt den Code aus dem default
branch?
Oder warum aufhören die case
mit 8?Warum nicht 5 oder 10 oder 127?
Lösung
Der Grund ist die Leistung.Die Instanziierung durch new ist etwas schneller als die Reflexion.Die meisten Klassen haben weniger als 8 Argumente, sodass dieser Schalter die meisten Fälle abdeckt.
Vielleicht wird es entfernt.
Andere Tipps
Der Leistungsgewinn ist fast unsichtbar.Wenn ich versuche, 1000000 Objekte mit den 2 Methoden zu instanziieren, ist hier das Ergebnis :
Ich verwende die Beta- und PHP-Version von Magento 2 (siehe unten)
PHP 5.6.12-1+deb.sury.org ~ vertrauenswürdig +1 (cli) Copyright (c) 1997-2015 Die PHP-Gruppe Zend-Engine v2.6.0, Urheberrecht (c) 1998-2015 Zend Technologie 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 zu machen, habe ich das benutzt Skript