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 ( $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 diese lange switch
Aussage? Warum nicht direkt den Code aus der default
Filiale verwenden?
Oder warum um case
8 aufhören ? Warum nicht 5 oder 10 oder 127?
magento2
magento-2.0
Marius
quelle
quelle
Antworten:
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.
quelle
Der Leistungsgewinn ist nahezu unsichtbar. Wenn ich versuche, 1000000 Objekte mit den beiden Methoden zu instanziieren, ist hier das Ergebnis:
Ich verwende Magento 2 Beta und PHP-Version (siehe unten)
Um diesen Test durchzuführen, habe ich dieses Skript verwendet
quelle